<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-05-08T03:14:13.348215" rpa="false" schemaversion="5">
<suite id="s1" name="bgpcep-bgp-ingest-mixed.txt">
<suite id="s1-s1" name="Singlepeer Changecount" source="/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/suites/bgpcep/bgpingest/singlepeer_changecount.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.185044" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.180702" elapsed="0.004424"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-08T03:14:14.180176" elapsed="0.005062"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.191304" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-08T03:14:14.186907" elapsed="0.004449"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-08T03:14:14.191694" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.191522" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.191477" elapsed="0.000310"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.192488" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.191998" elapsed="0.000540"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.193065" level="INFO">${cluster_size} = 0</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-08T03:14:14.192725" 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-05-08T03:14:14.193750" elapsed="0.000403"/>
</kw>
<msg time="2026-05-08T03:14:14.194272" level="INFO">${status} = PASS</msg>
<msg time="2026-05-08T03:14:14.194324" level="INFO">${possibly_int_of_members} = 0</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-08T03:14:14.193298" elapsed="0.001050"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.194951" level="INFO">${int_of_members} = 0</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-08T03:14:14.194530" elapsed="0.000450"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.196846" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-08T03:14:14.196502" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.197595" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-08T03:14:14.197040" elapsed="0.000583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.198356" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-08T03:14:14.197869" elapsed="0.000516"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<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="NOT RUN" start="2026-05-08T03:14:14.201081" elapsed="0.000030"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-05-08T03:14:14.200826" elapsed="0.000363"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.198457" elapsed="0.002772"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.201976" level="INFO">${ClusterManagement__member_index_list} = []</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.201438" elapsed="0.000612"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.202767" level="INFO">${ClusterManagement__index_to_ip_mapping} = {}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.202269" elapsed="0.000546"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.203401" level="INFO">${ClusterManagement__session_list} = []</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.202988" elapsed="0.000457"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-08T03:14:14.195933" elapsed="0.007582"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-08T03:14:14.186496" elapsed="0.017079"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.203808" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.203666" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.203632" 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-05-08T03:14:14.208146" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-08T03:14:14.207649" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.208801" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-08T03:14:14.208484" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-08T03:14:14.208880" elapsed="0.000054"/>
</return>
<msg time="2026-05-08T03:14:14.209075" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-08T03:14:14.207194" elapsed="0.001907"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<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="NOT RUN" start="2026-05-08T03:14:14.209526" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-05-08T03:14:14.209319" elapsed="0.000271"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.209184" elapsed="0.000435"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-08T03:14:14.204154" elapsed="0.005523"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-08T03:14:14.209901" elapsed="0.000226"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-05-08T03:14:14.210481" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-05-08T03:14:14.210332" elapsed="0.000214"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.210199" elapsed="0.000375"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-08T03:14:14.185708" elapsed="0.024925"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.213409" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.213263" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.213239" 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-05-08T03:14:14.218445" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.218315" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.218292" elapsed="0.000235"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.219657" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-08T03:14:14.219193" elapsed="0.000492"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.220174" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-08T03:14:14.219855" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-08T03:14:14.220246" elapsed="0.000041"/>
</return>
<msg time="2026-05-08T03:14:14.220415" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-08T03:14:14.218811" elapsed="0.001628"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.220837" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.221097" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-08T03:14:14.220943" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-05-08T03:14:14.220923" elapsed="0.000268"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-05-08T03:14:14.220682" elapsed="0.000533"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.220506" elapsed="0.000737"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-08T03:14:14.217918" elapsed="0.003382"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-08T03:14:14.211282" elapsed="0.010075"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-08T03:14:14.210796" elapsed="0.010611"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-08T03:14:14.179757" elapsed="0.041704"/>
</kw>
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-08T03:14:14.226225" level="INFO">Creating Session using : alias=default, url=http://:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74679a4001d0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-08T03:14:14.225662" elapsed="0.000767"/>
</kw>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="PASS" start="2026-05-08T03:14:14.225106" elapsed="0.001472"/>
</kw>
<kw name="CC_Setup" owner="ChangeCounter">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-08T03:14:14.231106" level="INFO">Creating Session using : alias=default, url=http://:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74679a6cf3d0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-08T03:14:14.230706" elapsed="0.000554"/>
</kw>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="PASS" start="2026-05-08T03:14:14.230266" elapsed="0.001066"/>
</kw>
<kw name="WU_Setup" owner="WaitUtils">
<kw name="SC_Setup" owner="ScalarClosures">
<kw name="Closure_From_Keyword_And_Arguments" owner="ScalarClosures">
<return>
<value>${keyword}</value>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-05-08T03:14:14.232295" elapsed="0.000046"/>
</return>
<msg time="2026-05-08T03:14:14.232533" level="INFO">${sc_fail} = ['BuiltIn.Fail', [], {}]</msg>
<var>${sc_fail}</var>
<arg>BuiltIn.Fail</arg>
<doc>Turn keyword with given arguments into a scalar closure.</doc>
<status status="PASS" start="2026-05-08T03:14:14.232082" elapsed="0.000476"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.237053" level="INFO">${ScalarClosures__fail} = ['BuiltIn.Fail', [], {}]</msg>
<arg>${ScalarClosures__fail}</arg>
<arg>${sc_fail}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.232734" elapsed="0.004368"/>
</kw>
<kw name="Closure_From_Keyword_And_Arguments" owner="ScalarClosures">
<return>
<value>${keyword}</value>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-05-08T03:14:14.237526" elapsed="0.000037"/>
</return>
<msg time="2026-05-08T03:14:14.237748" level="INFO">${sc_identity} = ['BuiltIn.Set_Variable', ['placeholder'], {}]</msg>
<var>${sc_identity}</var>
<arg>BuiltIn.Set_Variable</arg>
<arg>placeholder</arg>
<doc>Turn keyword with given arguments into a scalar closure.</doc>
<status status="PASS" start="2026-05-08T03:14:14.237330" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.242234" level="INFO">${ScalarClosures__identity} = ['BuiltIn.Set_Variable', ['placeholder'], {}]</msg>
<arg>${ScalarClosures__identity}</arg>
<arg>${sc_identity}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.237978" elapsed="0.004313"/>
</kw>
<doc>Resource setup. Create closures and assign them to suite variables.</doc>
<status status="PASS" start="2026-05-08T03:14:14.231811" elapsed="0.010555"/>
</kw>
<doc>Call dependency setup. Perhaps needed.</doc>
<status status="PASS" start="2026-05-08T03:14:14.231534" elapsed="0.010885"/>
</kw>
<kw name="Closure_From_Keyword_And_Arguments" owner="ScalarClosures">
<return>
<value>${keyword}</value>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-05-08T03:14:14.242835" elapsed="0.000036"/>
</return>
<msg time="2026-05-08T03:14:14.243060" level="INFO">${counter} = ['Get_Change_Count', [], {}]</msg>
<var>${counter}</var>
<arg>Get_Change_Count</arg>
<doc>Turn keyword with given arguments into a scalar closure.</doc>
<status status="PASS" start="2026-05-08T03:14:14.242643" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.247985" level="INFO">${ChangeCounter__getter} = ['Get_Change_Count', [], {}]</msg>
<arg>${ChangeCounter__getter}</arg>
<arg>${counter}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.243279" elapsed="0.004777"/>
</kw>
<doc>Initialize dependency libraries.</doc>
<status status="PASS" start="2026-05-08T03:14:14.226804" elapsed="0.021346"/>
</kw>
<kw name="PC_Setup" owner="PrefixCounting">
<kw name="WU_Setup" owner="WaitUtils">
<kw name="SC_Setup" owner="ScalarClosures">
<kw name="Closure_From_Keyword_And_Arguments" owner="ScalarClosures">
<return>
<value>${keyword}</value>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-05-08T03:14:14.249426" elapsed="0.000040"/>
</return>
<msg time="2026-05-08T03:14:14.249651" level="INFO">${sc_fail} = ['BuiltIn.Fail', [], {}]</msg>
<var>${sc_fail}</var>
<arg>BuiltIn.Fail</arg>
<doc>Turn keyword with given arguments into a scalar closure.</doc>
<status status="PASS" start="2026-05-08T03:14:14.249240" elapsed="0.000438"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.250388" level="INFO">${ScalarClosures__fail} = ['BuiltIn.Fail', [], {}]</msg>
<arg>${ScalarClosures__fail}</arg>
<arg>${sc_fail}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.249945" elapsed="0.000486"/>
</kw>
<kw name="Closure_From_Keyword_And_Arguments" owner="ScalarClosures">
<return>
<value>${keyword}</value>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-05-08T03:14:14.250802" elapsed="0.000030"/>
</return>
<msg time="2026-05-08T03:14:14.251010" level="INFO">${sc_identity} = ['BuiltIn.Set_Variable', ['placeholder'], {}]</msg>
<var>${sc_identity}</var>
<arg>BuiltIn.Set_Variable</arg>
<arg>placeholder</arg>
<doc>Turn keyword with given arguments into a scalar closure.</doc>
<status status="PASS" start="2026-05-08T03:14:14.250620" elapsed="0.000416"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.251651" level="INFO">${ScalarClosures__identity} = ['BuiltIn.Set_Variable', ['placeholder'], {}]</msg>
<arg>${ScalarClosures__identity}</arg>
<arg>${sc_identity}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.251223" elapsed="0.000474"/>
</kw>
<doc>Resource setup. Create closures and assign them to suite variables.</doc>
<status status="PASS" start="2026-05-08T03:14:14.248960" elapsed="0.002794"/>
</kw>
<doc>Call dependency setup. Perhaps needed.</doc>
<status status="PASS" start="2026-05-08T03:14:14.248680" elapsed="0.003119"/>
</kw>
<doc>Call dependency setups and construct suite variables.</doc>
<status status="PASS" start="2026-05-08T03:14:14.248402" elapsed="0.003462"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-08T03:14:14.252494" level="INFO">Creating Session using : alias=operational, url=http://:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74679a5f0950&gt;, timeout=125, proxies=None, verify=False,                     debug=0 </msg>
<arg>operational</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=125</arg>
<arg>max_retries=0</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-08T03:14:14.252060" elapsed="0.000644"/>
</kw>
<kw name="Set Default Configuration" owner="SSHLibrary">
<arg>prompt=${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Update the default `configuration`.</doc>
<status status="PASS" start="2026-05-08T03:14:14.252971" elapsed="0.000234"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-08T03:14:14.253524" elapsed="0.000325"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.256496" level="INFO">Length is 0.</msg>
<msg time="2026-05-08T03:14:14.256595" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-08T03:14:14.255907" elapsed="0.000722"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-08T03:14:14.256860" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.258735" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-05-08T03:14:14.259528" level="FAIL">OSError: [Errno 16] Device or resource busy</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="FAIL" start="2026-05-08T03:14:14.258100" elapsed="0.004389">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-05-08T03:14:14.262573" 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="FAIL" start="2026-05-08T03:14:14.257584" elapsed="0.005055"/>
</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="FAIL" start="2026-05-08T03:14:14.255292" elapsed="0.007487">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-05-08T03:14:14.262830" 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="FAIL" start="2026-05-08T03:14:14.254682" elapsed="0.008194"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.254200" elapsed="0.008776">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.263423" elapsed="0.000035"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<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="NOT RUN" start="2026-05-08T03:14:14.263735" elapsed="0.000034"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/suites/bgpcep/bgpingest/../../../../tools/fastbgp/play.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.263958" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${timeout}</var>
<arg>${TEST_DURATION_MULTIPLIER_CHANGE_COUNT_SINGLE} * (${COUNT_CHANGE_COUNT_SINGLE} * 9.0 / 10000 + 20)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.264161" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${bgp_filling_timeout}</arg>
<arg>${timeout}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.264379" elapsed="0.000025"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${bgp_emptying_timeout}</arg>
<arg>${bgp_filling_timeout*3.0/4}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.264614" elapsed="0.000026"/>
</kw>
<doc>Setup imported resources, SSH-login to tools system,
create HTTP session, put Python tool to tools system.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.179283" elapsed="0.085491">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s1-t1" name="Check_For_Empty_Ipv4_Topology_Before_Talking" line="88">
<doc>Wait for example-ipv4-topology to come up and empty. Give large timeout for case when BGP boots slower than restconf.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.264873" elapsed="0.000786">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t2" name="Reconfigure_ODL_To_Accept_Connection" line="94">
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.265947" elapsed="0.000439">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t3" name="Reconfigure_Data_Change_Counter" line="109">
<doc>Configure data change counter to count transactions in example-ipv4-topology instead of example-linkstate-topology.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.266615" elapsed="0.000551">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t4" name="Verify_Data_Change_Counter_Ready" line="113">
<doc>Data change counter might have been slower to start than ipv4 topology, wait for it.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.267352" elapsed="0.000437">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t5" name="Start_Talking_BGP_Speaker" line="117">
<doc>Start Python speaker to connect to ODL.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.267969" elapsed="0.000388">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t6" name="Wait_For_Stable_Talking_Ipv4_Topology" line="124">
<doc>Wait until example-ipv4-topology becomes stable. This is done by checking the change counter.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.268569" elapsed="0.000466">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t7" name="Check_Talking_Ipv4_Topology_Count" line="132">
<doc>Count the routes in example-ipv4-topology and fail if the count is not correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.269235" elapsed="0.000448">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t8" name="Kill_Talking_BGP_Speaker" line="138">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.269948" elapsed="0.000453">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t9" name="Store_Results_For_Talking_BGP_Speaker" line="148">
<doc>Store results for plotting</doc>
<status status="FAIL" start="2026-05-08T03:14:14.270595" elapsed="0.000328">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t10" name="Wait_For_Stable_Ipv4_Topology_After_Talking" line="156">
<doc>Wait until example-ipv4-topology becomes stable again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.271093" elapsed="0.000537">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t11" name="Check_For_Empty_Ipv4_Topology_After_Talking" line="165">
<doc>Example-ipv4-topology should be empty now.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.271912" elapsed="0.000461">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t12" name="Start_Listening_BGP_Speaker" line="171">
<doc>Start Python speaker in listening mode.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.272556" elapsed="0.000391">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t13" name="Reconfigure_ODL_To_Initiate_Connection" line="176">
<doc>Replace BGP peer config module, now with initiate-connection set to true.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.273173" elapsed="0.000421">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t14" name="Wait_For_Stable_Listening_Ipv4_Topology" line="192">
<doc>Wait until example-ipv4-topology becomes stable.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.273780" elapsed="0.000466">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t15" name="Check_Listening_Ipv4_Topology_Count" line="200">
<doc>Count the routes in example-ipv4-topology and fail if the count is not correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.274418" elapsed="0.000481">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t16" name="Kill_Listening_BGP_Speaker" line="206">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.275091" elapsed="0.000423">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t17" name="Store_Results_For_Listening_BGP_Speaker" line="216">
<doc>Store results for plotting</doc>
<status status="FAIL" start="2026-05-08T03:14:14.275720" elapsed="0.000369">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t18" name="Wait_For_Stable_Ipv4_Topology_After_Listening" line="226">
<doc>Wait until example-ipv4-topology becomes stable again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.276293" elapsed="0.000417">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t19" name="Check_For_Empty_Ipv4_Topology_After_Listening" line="235">
<doc>Example-ipv4-topology should be empty now.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.276874" elapsed="0.000431">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t20" name="Restore_Data_Change_Counter_Configuration" line="241">
<doc>Configure data change counter back to count transactions affecting example-linkstate-topology.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.277498" elapsed="0.000553">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t21" name="Delete_Bgp_Peer_Configuration" line="246">
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.278239" elapsed="0.000443">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Search_And_Kill_Remote_Python" owner="KillPythonTool">
<kw name="Search_For_Remote_Python_Processes" owner="KillPythonTool">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.283101" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-05-08T03:14:14.283313" level="INFO">${processes} = None</msg>
<msg time="2026-05-08T03:14:14.283370" level="FAIL">Connection not open</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="FAIL" start="2026-05-08T03:14:14.282896" elapsed="0.000926">Connection not open</status>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-05-08T03:14:14.283905" elapsed="0.000039"/>
</return>
<msg time="2026-05-08T03:14:14.284166" level="INFO">${processes} = None</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="FAIL" start="2026-05-08T03:14:14.282552" elapsed="0.001649">Connection not open</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.284847" level="INFO">None</msg>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-08T03:14:14.284456" elapsed="0.000480"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.286468" level="INFO">${arg_length} = None</msg>
<msg time="2026-05-08T03:14:14.286532" level="FAIL">Could not get length of 'None'.</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="FAIL" start="2026-05-08T03:14:14.285825" elapsed="0.000923">Could not get length of 'None'.</status>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="NOT RUN" start="2026-05-08T03:14:14.287086" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.286893" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.286852" elapsed="0.000354"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.287726" level="INFO">Executing command 'echo 'None' | awk '{print "kill -9",$4}''.</msg>
<msg time="2026-05-08T03:14:14.287918" level="INFO">${commands} = None</msg>
<msg time="2026-05-08T03:14:14.287983" level="FAIL">Connection not open</msg>
<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="FAIL" start="2026-05-08T03:14:14.287460" elapsed="0.001077">Connection not open</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.289253" level="INFO">None</msg>
<arg>${commands}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-08T03:14:14.288819" elapsed="0.000494"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.289722" level="INFO">Executing command 'echo 'set -exu; None' | sudo sh'.</msg>
<msg time="2026-05-08T03:14:14.289959" level="INFO">${stdout} = None</msg>
<msg time="2026-05-08T03:14:14.290019" level="INFO">${stderr} = None</msg>
<msg time="2026-05-08T03:14:14.290076" level="FAIL">Connection not open</msg>
<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="FAIL" start="2026-05-08T03:14:14.289490" elapsed="0.001109">Connection not open</status>
</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="FAIL" start="2026-05-08T03:14:14.285379" elapsed="0.005432">Several failures occurred:

1) Could not get length of 'None'.

2) Connection not open

3) Connection not open</status>
</kw>
<arg>'play\.py'</arg>
<doc>The main keyword. Search for processes, Log the list of them, kill them.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.282117" elapsed="0.008856">Several failures occurred:

1) Connection not open

2) Could not get length of 'None'.

3) Connection not open

4) Connection not open</status>
</kw>
<arg>KillPythonTool.Search_And_Kill_Remote_Python</arg>
<arg>'play\.py'</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-08T03:14:14.279923" elapsed="0.011260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Sysstat_Statistics" owner="Utils">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.292645" level="INFO">index=1
host=
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-08T03:14:14.292457" elapsed="0.000374"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.294125" level="INFO">${odl_connection} = 2</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-08T03:14:14.293554" elapsed="0.000622"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.296533" level="INFO">Length is 0.</msg>
<msg time="2026-05-08T03:14:14.296628" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-08T03:14:14.296188" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-08T03:14:14.296862" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.298555" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-05-08T03:14:14.299055" level="FAIL">OSError: [Errno 16] Device or resource busy</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="FAIL" start="2026-05-08T03:14:14.298074" elapsed="0.001719">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-05-08T03:14:14.299881" 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="FAIL" start="2026-05-08T03:14:14.297559" elapsed="0.002422"/>
</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="FAIL" start="2026-05-08T03:14:14.295660" elapsed="0.004540">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-05-08T03:14:14.300275" 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="FAIL" start="2026-05-08T03:14:14.294827" elapsed="0.005535"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.294430" elapsed="0.006088">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-05-08T03:14:14.300595" elapsed="0.000054"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at  and return its identifier.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.293168" elapsed="0.007716">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.301507" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>sar -A -f /var/log/sa/sa*</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.301199" elapsed="0.001124">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.302889" level="INFO">${output} = None</msg>
<msg time="2026-05-08T03:14:14.302948" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.302591" elapsed="0.001224">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.304551" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-08T03:14:14.304102" elapsed="0.000505"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-08T03:14:14.304800" elapsed="0.000140"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-08T03:14:14.305002" elapsed="0.000060"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-08T03:14:14.310106" elapsed="0.000217"/>
</kw>
<msg time="2026-05-08T03:14:14.310409" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-08T03:14:14.309376" elapsed="0.001139"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.310747" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.310954" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-08T03:14:14.305618" elapsed="0.005428"/>
</kw>
<doc>Store current connection index, open new connection to ip_address. Run command to get sysstat results from script,
which is running on all children nodes. Returns cpu, network, memory usage statistics from the node for each 10 minutes
that node was running. Used for debug purposes. Returns whole output of sysstat.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.292041" elapsed="0.019184">Several failures occurred:

1) OSError: [Errno 16] Device or resource busy

2) Cannot open session, you need to establish a connection first.

3) Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>Utils.Get_Sysstat_Statistics</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-08T03:14:14.291422" elapsed="0.019943"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-08T03:14:14.311605" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-08T03:14:14.311524" elapsed="0.000201"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-08T03:14:14.311880" elapsed="0.000125"/>
</kw>
<doc>Make sure Python tool was killed and tear down imported Resources.</doc>
<status status="PASS" start="2026-05-08T03:14:14.279513" elapsed="0.032548"/>
</kw>
<doc>BGP performance of ingesting from 1 iBGP peer, data change counter is used.

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


This suite uses play.py as single iBGP peer.
The suite only looks at example-ipv4-topology, so RIB is not examined.

This suite requires odl-bgpcep-data-change-counter to be installed so
make sure it is added to "install-features" of any jobs that are going
to invoke it.

The suite consists of two halves, differing on which side initiates BGP connection.
Data change counter is a lightweight way to detect "work is being done".
WaitUtils provide a nice Keyword to wait for stability, but it needs
initial value, that is why Store_Change_Count appears just before work-inducing action.
The time for Wait_For_Stable_* cases to finish is the main performance metric.
After waiting for stability is done, full check on number of prefixes present is performed.

Brief description how to configure BGP peer can be found here:
https://wiki.opendaylight.org/view/BGP_LS_PCEP:User_Guide#BGP_Peer
http://docs.opendaylight.org/en/stable-boron/user-guide/bgp-user-guide.html#bgp-peering

TODO: Currently, if a bug causes zero increase of data changes,
affected test cases will wait for max time. Reconsider.
If zero increase is allowed as stable, higher number of repetitions should be required.

Additionally this test suite is not compatible with Helium and Hydrogen
releases as they don't include data change counter feature.
Use the other version of the suite (singlepeer_prefixcount.robot) to test them.</doc>
<status status="FAIL" start="2026-05-08T03:14:13.402177" elapsed="0.909921">Suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</suite>
<suite id="s1-s2" name="Singlepeer Prefixcount" source="/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/suites/bgpcep/bgpingest/singlepeer_prefixcount.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.401796" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.397656" elapsed="0.004196"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-05-08T03:14:14.397409" elapsed="0.004515"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.406742" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-08T03:14:14.403070" elapsed="0.003700"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-05-08T03:14:14.406996" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.406865" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.406837" elapsed="0.000230"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.407683" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.407244" elapsed="0.000483"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.408221" level="INFO">${cluster_size} = 0</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-08T03:14:14.407893" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-05-08T03:14:14.408755" elapsed="0.000290"/>
</kw>
<msg time="2026-05-08T03:14:14.409164" level="INFO">${status} = PASS</msg>
<msg time="2026-05-08T03:14:14.409213" level="INFO">${possibly_int_of_members} = 0</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-08T03:14:14.408414" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.409956" level="INFO">${int_of_members} = 0</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-08T03:14:14.409428" elapsed="0.000564"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.411197" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-08T03:14:14.410910" elapsed="0.000315"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.411640" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-08T03:14:14.411379" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.412291" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-08T03:14:14.411889" elapsed="0.000437"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<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="NOT RUN" start="2026-05-08T03:14:14.415622" elapsed="0.000038"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-05-08T03:14:14.415370" elapsed="0.000352"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.412403" elapsed="0.003358"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.416526" level="INFO">${ClusterManagement__member_index_list} = []</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.415987" elapsed="0.000668"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.417303" level="INFO">${ClusterManagement__index_to_ip_mapping} = {}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.416852" elapsed="0.000498"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.417950" level="INFO">${ClusterManagement__session_list} = []</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.417522" elapsed="0.000472"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-05-08T03:14:14.410372" elapsed="0.007684"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-05-08T03:14:14.402725" elapsed="0.015496"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.418454" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.418319" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.418290" elapsed="0.000238"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.422572" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-08T03:14:14.421799" elapsed="0.000811"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.423214" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-08T03:14:14.422837" elapsed="0.000413"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-08T03:14:14.423301" elapsed="0.000049"/>
</return>
<msg time="2026-05-08T03:14:14.423505" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-08T03:14:14.421409" elapsed="0.002125"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<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="NOT RUN" start="2026-05-08T03:14:14.423966" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-05-08T03:14:14.423763" elapsed="0.000265"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.423606" elapsed="0.000450"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-05-08T03:14:14.418830" elapsed="0.005282"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-05-08T03:14:14.424320" elapsed="0.000250"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-05-08T03:14:14.424921" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-05-08T03:14:14.424774" elapsed="0.000212"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.424626" elapsed="0.000386"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-05-08T03:14:14.402273" elapsed="0.022794"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.428405" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.428226" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.428195" elapsed="0.000288"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.434053" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.433928" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.433907" elapsed="0.000295"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.435348" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-08T03:14:14.434863" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.435874" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-05-08T03:14:14.435545" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-05-08T03:14:14.435956" elapsed="0.000046"/>
</return>
<msg time="2026-05-08T03:14:14.436177" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-05-08T03:14:14.434478" elapsed="0.001726"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.436662" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.437042" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-08T03:14:14.436880" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-05-08T03:14:14.436861" elapsed="0.000292"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-05-08T03:14:14.436505" elapsed="0.000678"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-05-08T03:14:14.436286" elapsed="0.000926"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-05-08T03:14:14.433556" elapsed="0.003715"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-05-08T03:14:14.425732" elapsed="0.011595"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-08T03:14:14.425251" elapsed="0.012120"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-05-08T03:14:14.397064" elapsed="0.040370"/>
</kw>
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-08T03:14:14.442042" level="INFO">Creating Session using : alias=default, url=http://:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74679a4b9bd0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-08T03:14:14.441533" elapsed="0.000804"/>
</kw>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="PASS" start="2026-05-08T03:14:14.441071" elapsed="0.001358"/>
</kw>
<kw name="PC_Setup" owner="PrefixCounting">
<kw name="WU_Setup" owner="WaitUtils">
<kw name="SC_Setup" owner="ScalarClosures">
<kw name="Closure_From_Keyword_And_Arguments" owner="ScalarClosures">
<return>
<value>${keyword}</value>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-05-08T03:14:14.443725" elapsed="0.000033"/>
</return>
<msg time="2026-05-08T03:14:14.443943" level="INFO">${sc_fail} = ['BuiltIn.Fail', [], {}]</msg>
<var>${sc_fail}</var>
<arg>BuiltIn.Fail</arg>
<doc>Turn keyword with given arguments into a scalar closure.</doc>
<status status="PASS" start="2026-05-08T03:14:14.443538" elapsed="0.000431"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.448522" level="INFO">${ScalarClosures__fail} = ['BuiltIn.Fail', [], {}]</msg>
<arg>${ScalarClosures__fail}</arg>
<arg>${sc_fail}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.444178" elapsed="0.004400"/>
</kw>
<kw name="Closure_From_Keyword_And_Arguments" owner="ScalarClosures">
<return>
<value>${keyword}</value>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-05-08T03:14:14.449046" elapsed="0.000043"/>
</return>
<msg time="2026-05-08T03:14:14.449310" level="INFO">${sc_identity} = ['BuiltIn.Set_Variable', ['placeholder'], {}]</msg>
<var>${sc_identity}</var>
<arg>BuiltIn.Set_Variable</arg>
<arg>placeholder</arg>
<doc>Turn keyword with given arguments into a scalar closure.</doc>
<status status="PASS" start="2026-05-08T03:14:14.448807" elapsed="0.000529"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.453856" level="INFO">${ScalarClosures__identity} = ['BuiltIn.Set_Variable', ['placeholder'], {}]</msg>
<arg>${ScalarClosures__identity}</arg>
<arg>${sc_identity}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-05-08T03:14:14.449530" elapsed="0.004378"/>
</kw>
<doc>Resource setup. Create closures and assign them to suite variables.</doc>
<status status="PASS" start="2026-05-08T03:14:14.443240" elapsed="0.010746"/>
</kw>
<doc>Call dependency setup. Perhaps needed.</doc>
<status status="PASS" start="2026-05-08T03:14:14.442951" elapsed="0.011082"/>
</kw>
<doc>Call dependency setups and construct suite variables.</doc>
<status status="PASS" start="2026-05-08T03:14:14.442680" elapsed="0.011408"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-08T03:14:14.454763" level="INFO">Creating Session using : alias=operational, url=http://:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74679a4e6a90&gt;, timeout=125, proxies=None, verify=False,                     debug=0 </msg>
<arg>operational</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=125</arg>
<arg>max_retries=0</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-08T03:14:14.454357" elapsed="0.000560"/>
</kw>
<kw name="Set Default Configuration" owner="SSHLibrary">
<arg>prompt=${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Update the default `configuration`.</doc>
<status status="PASS" start="2026-05-08T03:14:14.455092" elapsed="0.000203"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-08T03:14:14.455468" elapsed="0.000261"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.458029" level="INFO">Length is 0.</msg>
<msg time="2026-05-08T03:14:14.458172" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-08T03:14:14.457626" elapsed="0.000587"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-08T03:14:14.458427" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.460443" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-05-08T03:14:14.461021" level="FAIL">OSError: [Errno 16] Device or resource busy</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="FAIL" start="2026-05-08T03:14:14.459753" elapsed="0.002620">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-05-08T03:14:14.462477" 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="FAIL" start="2026-05-08T03:14:14.459094" elapsed="0.003561"/>
</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="FAIL" start="2026-05-08T03:14:14.457046" elapsed="0.005844">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-05-08T03:14:14.462993" 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="FAIL" start="2026-05-08T03:14:14.456469" elapsed="0.006599"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.456015" elapsed="0.007197">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.463592" elapsed="0.000031"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<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="NOT RUN" start="2026-05-08T03:14:14.463919" elapsed="0.000026"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/suites/bgpcep/bgpingest/../../../../tools/fastbgp/play.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.464200" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${timeout}</var>
<arg>${TEST_DURATION_MULTIPLIER_PREFIX_COUNT_SINGLE} * (${COUNT_PREFIX_COUNT_SINGLE} * 9.0 / 10000 + 20)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.464470" elapsed="0.000028"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${bgp_filling_timeout}</arg>
<arg>${timeout}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.464719" elapsed="0.000031"/>
</kw>
<doc>Setup imported resources, SSH-login to tools system,
create HTTP session, put Python tool to tools system.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.396642" elapsed="0.068237">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s2-t1" name="Check_For_Empty_Ipv4_Topology_Before_Talking" line="79">
<doc>Wait for example-ipv4-topology to come up and empty. Give large timeout for case when BGP boots slower than restconf.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.464991" elapsed="0.000705">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t2" name="Reconfigure_ODL_To_Accept_Connection" line="85">
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.465876" elapsed="0.000442">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t3" name="Start_Talking_BGP_Speaker" line="100">
<doc>Start Python speaker to connect to ODL.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.466489" elapsed="0.000309">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t4" name="Wait_For_Stable_Talking_Ipv4_Topology" line="106">
<doc>Wait until example-ipv4-topology becomes stable. This is done by checking stability of prefix count.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.466967" elapsed="0.000452">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t5" name="Check_Talking_Ipv4_Topology_Count" line="114">
<doc>Count the routes in example-ipv4-topology and fail if the count is not correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.467580" elapsed="0.000411">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t6" name="Kill_Talking_BGP_Speaker" line="120">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.468176" elapsed="0.000373">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t7" name="Store_Results_For_Talking_BGP_Speaker" line="129">
<doc>Store results for plotting</doc>
<status status="FAIL" start="2026-05-08T03:14:14.468717" elapsed="0.000331">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t8" name="Wait_For_Stable_Ipv4_Topology_After_Talking" line="137">
<doc>Wait until example-ipv4-topology becomes stable again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.469229" elapsed="0.000390">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t9" name="Check_For_Empty_Ipv4_Topology_After_Talking" line="149">
<doc>Example-ipv4-topology should be empty now.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.469788" elapsed="0.000423">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t10" name="Start_Listening_BGP_Speaker" line="155">
<doc>Start Python speaker in listening mode.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.470403" elapsed="0.000317">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t11" name="Reconfigure_ODL_To_Initiate_Connection" line="160">
<doc>Replace BGP peer config module, now with initiate-connection set to true.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.470881" elapsed="0.000418">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t12" name="Wait_For_Stable_Listening_Ipv4_Topology" line="175">
<doc>Wait until example-ipv4-topology becomes stable.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.471540" elapsed="0.000357">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t13" name="Check_Listening_Ipv4_Topology_Count" line="183">
<doc>Count the routes in example-ipv4-topology and fail if the count is not correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.472057" elapsed="0.000439">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t14" name="Kill_Listening_BGP_Speaker" line="189">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.472661" elapsed="0.000352">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t15" name="Store_Results_For_Listening_BGP_Speaker" line="198">
<doc>Store results for plotting</doc>
<status status="FAIL" start="2026-05-08T03:14:14.473188" elapsed="0.000352">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t16" name="Wait_For_Stable_Ipv4_Topology_After_Listening" line="208">
<doc>Wait until example-ipv4-topology becomes stable again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.473709" elapsed="0.000514">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t17" name="Check_For_Empty_Ipv4_Topology_After_Listening" line="217">
<doc>Example-ipv4-topology should be empty now.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-05-08T03:14:14.474395" elapsed="0.000475">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t18" name="Delete_Bgp_Peer_Configuration" line="223">
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.475051" elapsed="0.000467">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Search_And_Kill_Remote_Python" owner="KillPythonTool">
<kw name="Search_For_Remote_Python_Processes" owner="KillPythonTool">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.477853" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-05-08T03:14:14.478019" level="INFO">${processes} = None</msg>
<msg time="2026-05-08T03:14:14.478062" level="FAIL">Connection not open</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="FAIL" start="2026-05-08T03:14:14.477682" elapsed="0.000874">Connection not open</status>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-05-08T03:14:14.478631" elapsed="0.000040"/>
</return>
<msg time="2026-05-08T03:14:14.478863" level="INFO">${processes} = None</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="FAIL" start="2026-05-08T03:14:14.477362" elapsed="0.001527">Connection not open</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.479691" level="INFO">None</msg>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-08T03:14:14.479064" elapsed="0.000676"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.480813" level="INFO">${arg_length} = None</msg>
<msg time="2026-05-08T03:14:14.480873" level="FAIL">Could not get length of 'None'.</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="FAIL" start="2026-05-08T03:14:14.480367" elapsed="0.000646">Could not get length of 'None'.</status>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="NOT RUN" start="2026-05-08T03:14:14.481275" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-05-08T03:14:14.481112" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-05-08T03:14:14.481088" elapsed="0.000286"/>
</if>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.481763" level="INFO">Executing command 'echo 'None' | awk '{print "kill -9",$4}''.</msg>
<msg time="2026-05-08T03:14:14.481892" level="INFO">${commands} = None</msg>
<msg time="2026-05-08T03:14:14.481939" level="FAIL">Connection not open</msg>
<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="FAIL" start="2026-05-08T03:14:14.481547" elapsed="0.000851">Connection not open</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.482851" level="INFO">None</msg>
<arg>${commands}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-08T03:14:14.482593" elapsed="0.000324"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.483299" level="INFO">Executing command 'echo 'set -exu; None' | sudo sh'.</msg>
<msg time="2026-05-08T03:14:14.483433" level="INFO">${stdout} = None</msg>
<msg time="2026-05-08T03:14:14.483489" level="INFO">${stderr} = None</msg>
<msg time="2026-05-08T03:14:14.483531" level="FAIL">Connection not open</msg>
<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="FAIL" start="2026-05-08T03:14:14.483085" elapsed="0.000734">Connection not open</status>
</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="FAIL" start="2026-05-08T03:14:14.480011" elapsed="0.003955">Several failures occurred:

1) Could not get length of 'None'.

2) Connection not open

3) Connection not open</status>
</kw>
<arg>'play\.py'</arg>
<doc>The main keyword. Search for processes, Log the list of them, kill them.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.476980" elapsed="0.007174">Several failures occurred:

1) Connection not open

2) Could not get length of 'None'.

3) Connection not open

4) Connection not open</status>
</kw>
<arg>KillPythonTool.Search_And_Kill_Remote_Python</arg>
<arg>'play\.py'</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-08T03:14:14.476410" elapsed="0.007826"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Sysstat_Statistics" owner="Utils">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.485595" level="INFO">index=1
host=
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-05-08T03:14:14.485411" elapsed="0.000353"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.486943" level="INFO">${odl_connection} = 2</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-05-08T03:14:14.486500" elapsed="0.000470"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.489176" level="INFO">Length is 0.</msg>
<msg time="2026-05-08T03:14:14.489271" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-08T03:14:14.488773" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-08T03:14:14.489509" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.491314" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-05-08T03:14:14.491708" level="FAIL">OSError: [Errno 16] Device or resource busy</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="FAIL" start="2026-05-08T03:14:14.490653" elapsed="0.001587">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-05-08T03:14:14.492382" 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="FAIL" start="2026-05-08T03:14:14.490214" elapsed="0.002247"/>
</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="FAIL" start="2026-05-08T03:14:14.488187" elapsed="0.004422">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-05-08T03:14:14.492661" 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="FAIL" start="2026-05-08T03:14:14.487597" elapsed="0.005130"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.487221" elapsed="0.005622">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-05-08T03:14:14.492902" elapsed="0.000038"/>
</return>
<arg>${ip_address}</arg>
<doc>Open a connection to the ODL system at  and return its identifier.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.486070" elapsed="0.007030">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.493537" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>sar -A -f /var/log/sa/sa*</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.493321" elapsed="0.000881">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-05-08T03:14:14.494746" level="INFO">${output} = None</msg>
<msg time="2026-05-08T03:14:14.494802" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<var>${output}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.494477" elapsed="0.001022">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-08T03:14:14.495988" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-08T03:14:14.495681" elapsed="0.000353"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-05-08T03:14:14.496231" elapsed="0.000140"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-05-08T03:14:14.496420" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-05-08T03:14:14.500342" elapsed="0.000181"/>
</kw>
<msg time="2026-05-08T03:14:14.500583" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-05-08T03:14:14.499739" 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-05-08T03:14:14.500841" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-05-08T03:14:14.501052" elapsed="0.000029"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-05-08T03:14:14.496861" elapsed="0.004308"/>
</kw>
<doc>Store current connection index, open new connection to ip_address. Run command to get sysstat results from script,
which is running on all children nodes. Returns cpu, network, memory usage statistics from the node for each 10 minutes
that node was running. Used for debug purposes. Returns whole output of sysstat.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.485016" elapsed="0.016294">Several failures occurred:

1) OSError: [Errno 16] Device or resource busy

2) Cannot open session, you need to establish a connection first.

3) Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>Utils.Get_Sysstat_Statistics</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-08T03:14:14.484467" elapsed="0.016901"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-05-08T03:14:14.501630" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-05-08T03:14:14.501521" elapsed="0.000250"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-05-08T03:14:14.501977" elapsed="0.000129"/>
</kw>
<doc>Make sure Python tool was killed and tear down imported Resources.</doc>
<status status="PASS" start="2026-05-08T03:14:14.476031" elapsed="0.026194"/>
</kw>
<doc>BGP performance of ingesting from 1 iBGP peer, data change counter is NOT used.

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


This suite uses play.py as single iBGP peer.
The suite only looks at example-ipv4-topology, so RIB is not examined.

The suite consists of two halves, differing on which side initiates BGP connection.
State of "work is being done" is detected by increasing value of prefixes in topology.
The time for Wait_For_Stable_* cases to finish is the main performance metric.
After waiting for stability is done, full check on number of prefixes present is performed.

Brief description how to configure BGP peer can be found here:
https://wiki.opendaylight.org/view/BGP_LS_PCEP:User_Guide#BGP_Peer
http://docs.opendaylight.org/en/stable-boron/user-guide/bgp-user-guide.html#bgp-peering

TODO: Currently, if a bug causes prefix count to remain at zero,
affected test cases will wait for max time. Reconsider.
If zero is allowed as stable, higher period or repetitions would be required.

The prefix counting is quite heavyweight and may induce large variation in time.
Try the other version of the suite (singlepeer_changecount.robot) to get better precision.</doc>
<status status="FAIL" start="2026-05-08T03:14:14.313028" elapsed="0.189250">Suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</suite>
<status status="FAIL" start="2026-05-08T03:14:13.350146" elapsed="1.153484"/>
</suite>
<statistics>
<total>
<stat pass="0" fail="39" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="0" fail="18" skip="0">critical</stat>
</tag>
<suite>
<stat name="bgpcep-bgp-ingest-mixed.txt" id="s1" pass="0" fail="39" skip="0">bgpcep-bgp-ingest-mixed.txt</stat>
<stat name="Singlepeer Changecount" id="s1-s1" pass="0" fail="21" skip="0">bgpcep-bgp-ingest-mixed.txt.Singlepeer Changecount</stat>
<stat name="Singlepeer Prefixcount" id="s1-s2" pass="0" fail="18" skip="0">bgpcep-bgp-ingest-mixed.txt.Singlepeer Prefixcount</stat>
</suite>
</statistics>
<errors>
<msg time="2026-05-08T03:14:13.656729" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/BGPSpeaker.robot' on line 27: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Changecount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-08T03:14:13.665580" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Changecount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-08T03:14:13.690841" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Changecount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-08T03:14:13.735817" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Changecount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-08T03:14:14.100966" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Changecount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-08T03:14:14.316171" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/BGPSpeaker.robot' on line 27: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Prefixcount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-08T03:14:14.317267" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Prefixcount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-08T03:14:14.317811" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Prefixcount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-08T03:14:14.318408" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Prefixcount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-05-08T03:14:14.332221" level="WARN">Error in file '/w/workspace/bgpcep-csit-1node-bgp-ingest-mixed-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'bgpcep-bgp-ingest-mixed.txt.Singlepeer Prefixcount' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
</errors>
</robot>
