<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-26T00:20:36.583718" rpa="false" schemaversion="5">
<suite id="s1" name="mdsal-netty-replicate.txt" source="/w/workspace/mdsal-csit-3node-netty-replicate-only-vanadium/test/csit/suites/mdsal/netty_replicate/netty-replicate.robot">
<kw name="Setup_suite" type="SETUP">
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.177207" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-26T00:20:37.173755" elapsed="0.003492"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-26T00:20:37.177523" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.177386" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.177357" elapsed="0.000245"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.178159" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:20:37.177769" elapsed="0.000441"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.178752" 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-04-26T00:20:37.178406" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-26T00:20:37.179383" elapsed="0.000309"/>
</kw>
<msg time="2026-04-26T00:20:37.179806" level="INFO">${status} = PASS</msg>
<msg time="2026-04-26T00:20:37.179886" 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-04-26T00:20:37.178956" elapsed="0.000957"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.180511" 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-04-26T00:20:37.180093" elapsed="0.000446"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.182122" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.181844" elapsed="0.000307"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.182601" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.182324" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.183141" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.182790" elapsed="0.000380"/>
</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-04-26T00:20:37.185596" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.185404" elapsed="0.000267"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.183231" elapsed="0.002470"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.186266" 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-04-26T00:20:37.185861" elapsed="0.000468"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.186884" 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-04-26T00:20:37.186491" elapsed="0.000436"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.187478" 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-04-26T00:20:37.187085" elapsed="0.000436"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.181367" elapsed="0.006217"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-26T00:20:37.173122" elapsed="0.014521"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.187858" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.187716" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.187693" elapsed="0.000236"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.190850" 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-04-26T00:20:37.190464" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.191339" 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-04-26T00:20:37.191032" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.191412" elapsed="0.000039"/>
</return>
<msg time="2026-04-26T00:20:37.191582" 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-04-26T00:20:37.190114" elapsed="0.001493"/>
</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-04-26T00:20:37.192051" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.191865" elapsed="0.000248"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.191729" elapsed="0.000411"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.188152" elapsed="0.004044"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-26T00:20:37.192359" elapsed="0.000212"/>
</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-04-26T00:20:37.192882" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.192749" elapsed="0.000198"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.192624" elapsed="0.000350"/>
</for>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-26T00:20:37.172533" elapsed="0.020498"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.195430" 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-04-26T00:20:37.195031" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.195924" 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-04-26T00:20:37.195611" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.195995" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:20:37.196152" level="INFO">${members_index_list} = []</msg>
<var>${members_index_list}</var>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.193227" elapsed="0.002950"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<var>${member_ip_address}</var>
<arg>${cluster_member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.196561" elapsed="0.000024"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=pushd ${karaf_home} &amp;&amp; tar -cvf /tmp/config_backup.tar ./configuration/initial/ &amp;&amp; popd</arg>
<arg>member_index=${cluster_member_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.196767" elapsed="0.000023"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=pushd ${karaf_home} &amp;&amp; ./bin/configure_cluster.sh 1 ${member_ip_address} &amp;&amp; popd</arg>
<arg>member_index=${cluster_member_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.196970" elapsed="0.000023"/>
</kw>
<var name="${cluster_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.196378" elapsed="0.000650"/>
</iter>
<var>${cluster_member_index}</var>
<value>@{members_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.196227" elapsed="0.000829"/>
</for>
<doc>Open karaf connections to each ODL and deconfigure cluster to prevent interferance of shard replication with netty replication.</doc>
<status status="PASS" start="2026-04-26T00:20:37.171954" elapsed="0.025156"/>
</kw>
<test id="s1-t1" name="Replicate_Config_Addition" line="28">
<kw name="Setup_Test" type="SETUP">
<kw name="Clear_Data_On_All_Nodes_And_Restart">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.202894" 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-04-26T00:20:37.202506" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.203383" 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-04-26T00:20:37.203077" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.203455" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:20:37.203615" level="INFO">${stop_index_list} = []</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.202115" elapsed="0.001525"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.204637" 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-04-26T00:20:37.204246" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.205100" 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-04-26T00:20:37.204818" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.205170" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:20:37.205340" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.203874" elapsed="0.001491"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.206849" 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-04-26T00:20:37.206460" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.207328" 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-04-26T00:20:37.207028" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.207398" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:20:37.207553" 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-04-26T00:20:37.206077" elapsed="0.001500"/>
</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-04-26T00:20:37.207929" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.207744" elapsed="0.000245"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.207629" elapsed="0.000387"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.205599" elapsed="0.002469"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.208516" level="INFO">${updated_index_list} = []</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.208214" elapsed="0.000327"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.208781" elapsed="0.000232"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.209199" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.209088" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.209067" elapsed="0.000214"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.209576" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.209440" elapsed="0.000197"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.209325" elapsed="0.000338"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.212635" 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-04-26T00:20:37.212235" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.213102" 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-04-26T00:20:37.212815" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.213175" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:20:37.213352" 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-04-26T00:20:37.211859" elapsed="0.001518"/>
</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-04-26T00:20:37.213708" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.213542" elapsed="0.000225"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.213430" elapsed="0.000364"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.209850" elapsed="0.003996"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:20:37.213885" elapsed="0.000027"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-26T00:20:37.198385" elapsed="0.015623"/>
</kw>
<kw name="Clean_Journals_Data_And_Snapshots_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.217189" 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-04-26T00:20:37.216808" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.217676" 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-04-26T00:20:37.217391" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.217747" elapsed="0.000032"/>
</return>
<msg time="2026-04-26T00:20:37.217939" 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-04-26T00:20:37.216436" elapsed="0.001529"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.218954" level="INFO">${command} = rm -rf "/tmp/karaf-0.23.2-SNAPSHOT/"*journal "/tmp/karaf-0.23.2-SNAPSHOT/snapshots" "/tmp/karaf-0.23.2-SNAPSHOT/data"</msg>
<var>${command}</var>
<arg>rm -rf "${karaf_home}/"*journal "${karaf_home}/snapshots" "${karaf_home}/data"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.218599" elapsed="0.000382"/>
</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-04-26T00:20:37.219341" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.219156" elapsed="0.000245"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.219037" elapsed="0.000392"/>
</for>
<doc>Delete journal and snapshots directories on every node listed (or all).
BEWARE: If only a subset of members is cleaned, this causes RetiredGenerationException in Carbon after the affected node re-start.
See https://bugs.opendaylight.org/show_bug.cgi?id=8138</doc>
<status status="PASS" start="2026-04-26T00:20:37.214232" elapsed="0.005251"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.230611" level="INFO">${base_command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.230201" elapsed="0.000438"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.231173" level="INFO">${command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.230813" elapsed="0.000388"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:20:37.231784" level="INFO">${epoch} = 1777162837.231705</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-26T00:20:37.231373" elapsed="0.000437"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.232395" level="INFO">${gc_filepath} = /tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.231705.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.231984" elapsed="0.000437"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.232947" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.231705.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.232582" elapsed="0.000391"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.234453" 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-04-26T00:20:37.234068" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.234915" 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-04-26T00:20:37.234631" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.234984" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:20:37.235138" 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-04-26T00:20:37.233712" elapsed="0.001450"/>
</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-04-26T00:20:37.235504" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.235338" elapsed="0.000225"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.235213" elapsed="0.000376"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.233177" elapsed="0.002463"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.246079" 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-04-26T00:20:37.245700" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.246572" 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-04-26T00:20:37.246260" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.246643" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:20:37.246798" 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-04-26T00:20:37.245322" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.247333" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.247477" elapsed="0.000020"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.247433" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.247413" elapsed="0.000133"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.247683" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.247093" elapsed="0.000643"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.246927" elapsed="0.000835"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-26T00:20:37.244920" elapsed="0.002896"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.244615" elapsed="0.003244"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.244593" elapsed="0.003291"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.249335" 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-04-26T00:20:37.248939" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.249800" 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-04-26T00:20:37.249516" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.249870" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.250020" 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-04-26T00:20:37.248576" elapsed="0.001469"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.250384" elapsed="0.000024"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.253869" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.250211" elapsed="0.003723"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.250096" elapsed="0.003865"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:20:37.248195" elapsed="0.005818"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.247940" elapsed="0.006101"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.247924" elapsed="0.006141"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.254457" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.254122" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.254105" elapsed="0.000434"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-26T00:20:37.244060" elapsed="0.010525"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:20:37.235791" elapsed="0.018854"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.257854" 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-04-26T00:20:37.257474" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.258335" 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-04-26T00:20:37.258033" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.258405" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:20:37.258556" 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-04-26T00:20:37.257066" elapsed="0.001514"/>
</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-04-26T00:20:37.258901" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.258737" elapsed="0.000223"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.258629" elapsed="0.000356"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.254910" elapsed="0.004160"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-26T00:20:37.223220" elapsed="0.035899"/>
</kw>
<doc>Clear data after stoping all members and then restart all members.</doc>
<status status="PASS" start="2026-04-26T00:20:37.197949" elapsed="0.061219"/>
</kw>
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-26T00:20:37.261555" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-26T00:20:37.261301" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.262776" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.262665" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.262642" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.267105" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.266998" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.266980" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.268176" 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-04-26T00:20:37.267771" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.268661" 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-04-26T00:20:37.268377" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.268732" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.268882" 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-04-26T00:20:37.267407" elapsed="0.001499"/>
</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-04-26T00:20:37.269239" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.269498" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.269353" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.269335" elapsed="0.000237"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.269105" elapsed="0.000490"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.268958" elapsed="0.000660"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:20:37.266646" elapsed="0.003024"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-26T00:20:37.262380" elapsed="0.007344"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:20:37.261952" elapsed="0.007816"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-26T00:20:37.259371" elapsed="0.010448"/>
</kw>
<doc>Clear data and set loging.</doc>
<status status="PASS" start="2026-04-26T00:20:37.197695" elapsed="0.072170"/>
</kw>
<kw name="Setup_Netty_Replication" owner="NettyReplication">
<kw name="Open_Source_Connection" owner="NettyReplication">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.271441" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.271334" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.271315" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-26T00:20:37.272082" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.271643" elapsed="0.000654">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.272474" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.272645" elapsed="0.000021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.272816" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.273075" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.272906" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.272890" elapsed="0.000261"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.273307" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.273522" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.273390" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.273374" elapsed="0.000223"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.273629" elapsed="0.000014"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<msg time="2026-04-26T00:20:37.278042" level="FAIL">Variable '${current_connection_index}' not found.</msg>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.274409" elapsed="0.003669">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.273890" elapsed="0.004256">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>config:edit org.opendaylight.mdsal.replicate.netty.source</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.271020" elapsed="0.007219">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:property-set enabled true</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.278597" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:update</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.278937" elapsed="0.000024"/>
</kw>
<arg>${source_member_index}</arg>
<doc>Open source part of netty replicate connection on specific node.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.270506" elapsed="0.008550">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<for flavor="IN">
<iter>
<kw name="Open_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<arg>source_member_index=${source_member_index}</arg>
<doc>Open sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.279347" elapsed="0.000023"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.279165" elapsed="0.000241"/>
</iter>
<var>${sink_member_index}</var>
<value>@{sink_members_indexes}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.279113" elapsed="0.000319"/>
</for>
<doc>Set up netty replication connections betwean source and sinks.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.270098" elapsed="0.009418">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>iterations=${5}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.279691" elapsed="0.000022"/>
</kw>
<kw name="Teardown_Test" type="TEARDOWN">
<for flavor="IN">
<iter>
<kw name="Close_Source_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close source part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.280487" elapsed="0.000024"/>
</kw>
<kw name="Close_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.280700" elapsed="0.000022"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.280313" elapsed="0.000441"/>
</iter>
<var>${sink_member_index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.280178" elapsed="0.000601"/>
</for>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.281876" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.281509" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.281491" elapsed="0.000468"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:20:37.282095" elapsed="0.000326"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.290180" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.286623" elapsed="0.003585"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-26T00:20:37.290446" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.290302" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.290266" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.290944" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.290647" elapsed="0.000323"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-26T00:20:37.291459" level="INFO">${reference} = mdsal_netty_replicate_txt_Replicate_Config_Addition</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.291120" elapsed="0.000403"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-26T00:20:37.291861" level="INFO">${reference} = mdsal_netty_replicate_txt_replicate_config_addition</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.291684" elapsed="0.000227"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.292420" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_config_addition"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.292061" elapsed="0.000386"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.292901" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_config_addition&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.292594" elapsed="0.000334"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.293552" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_config_addition"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_config_addition&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.293074" elapsed="0.000529"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.294042" level="INFO">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_config_addition"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_config_addition&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-26T00:20:37.293749" elapsed="0.000347"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-26T00:20:37.286329" elapsed="0.007821"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.281306" elapsed="0.012893"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.280958" elapsed="0.013282"/>
</kw>
<doc>Close all netty replication connections and show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.279985" elapsed="0.014314"/>
</kw>
<doc>Adding new configuration on source node should be replicated on sink node.</doc>
<tag>3node</tag>
<tag>critical</tag>
<tag>netty-replicate</tag>
<status status="FAIL" start="2026-04-26T00:20:37.197177" elapsed="0.097162">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_config_addition"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_config_addition&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</test>
<test id="s1-t2" name="Replicate_Config_Update" line="33">
<kw name="Setup_Test" type="SETUP">
<kw name="Clear_Data_On_All_Nodes_And_Restart">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.300033" 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-04-26T00:20:37.299635" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.300514" 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-04-26T00:20:37.300215" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.300585" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:20:37.300738" level="INFO">${stop_index_list} = []</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.299253" elapsed="0.001509"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.301723" 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-04-26T00:20:37.301353" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.302176" 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-04-26T00:20:37.301898" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.302245" elapsed="0.000041"/>
</return>
<msg time="2026-04-26T00:20:37.302410" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.300959" elapsed="0.001476"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.303912" 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-04-26T00:20:37.303482" elapsed="0.000457"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.304390" 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-04-26T00:20:37.304091" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.304460" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.304609" 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-04-26T00:20:37.303103" elapsed="0.001530"/>
</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-04-26T00:20:37.304962" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.304799" elapsed="0.000222"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.304684" elapsed="0.000363"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.302637" elapsed="0.002460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.305548" level="INFO">${updated_index_list} = []</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.305238" elapsed="0.000337"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.305721" elapsed="0.000198"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.306094" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.305991" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.305972" elapsed="0.000185"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.306459" elapsed="0.000187"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.306320" elapsed="0.000370"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.306193" elapsed="0.000524"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.309643" 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-04-26T00:20:37.309258" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.310100" 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-04-26T00:20:37.309820" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.310170" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.310336" 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-04-26T00:20:37.308898" elapsed="0.001463"/>
</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-04-26T00:20:37.310679" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.310517" elapsed="0.000220"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.310411" elapsed="0.000352"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.306905" elapsed="0.003908"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:20:37.310852" elapsed="0.000025"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-26T00:20:37.295739" elapsed="0.015231"/>
</kw>
<kw name="Clean_Journals_Data_And_Snapshots_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.313899" 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-04-26T00:20:37.313527" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.314372" 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-04-26T00:20:37.314075" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.314442" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.314591" 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-04-26T00:20:37.313149" elapsed="0.001466"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.315159" level="INFO">${command} = rm -rf "/tmp/karaf-0.23.2-SNAPSHOT/"*journal "/tmp/karaf-0.23.2-SNAPSHOT/snapshots" "/tmp/karaf-0.23.2-SNAPSHOT/data"</msg>
<var>${command}</var>
<arg>rm -rf "${karaf_home}/"*journal "${karaf_home}/snapshots" "${karaf_home}/data"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.314779" elapsed="0.000407"/>
</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-04-26T00:20:37.315522" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.315361" elapsed="0.000220"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.315237" elapsed="0.000370"/>
</for>
<doc>Delete journal and snapshots directories on every node listed (or all).
BEWARE: If only a subset of members is cleaned, this causes RetiredGenerationException in Carbon after the affected node re-start.
See https://bugs.opendaylight.org/show_bug.cgi?id=8138</doc>
<status status="PASS" start="2026-04-26T00:20:37.311187" elapsed="0.004471"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.326461" level="INFO">${base_command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.326078" elapsed="0.000410"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.327000" level="INFO">${command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.326647" elapsed="0.000379"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:20:37.327450" level="INFO">${epoch} = 1777162837.327381</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-26T00:20:37.327185" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.328038" level="INFO">${gc_filepath} = /tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.327381.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.327633" elapsed="0.000431"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.328608" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.327381.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.328222" elapsed="0.000412"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.330073" 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-04-26T00:20:37.329705" elapsed="0.000394"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.330544" 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-04-26T00:20:37.330249" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.330613" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.330761" 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-04-26T00:20:37.329343" elapsed="0.001442"/>
</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-04-26T00:20:37.331110" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.330940" elapsed="0.000228"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.330834" elapsed="0.000360"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.328832" elapsed="0.002412"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.341460" 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-04-26T00:20:37.341068" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.341923" 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-04-26T00:20:37.341640" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.341992" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:20:37.342144" 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-04-26T00:20:37.340702" elapsed="0.001465"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.342612" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.342775" elapsed="0.000017"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.342705" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.342687" elapsed="0.000153"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.342973" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.342392" elapsed="0.000634"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.342219" elapsed="0.000832"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-26T00:20:37.340321" elapsed="0.002783"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.340008" elapsed="0.003126"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.339988" elapsed="0.003168"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.344654" 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-04-26T00:20:37.344206" elapsed="0.000475"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.345108" 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-04-26T00:20:37.344830" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.345183" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.345358" 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-04-26T00:20:37.343834" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.345708" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.350214" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.345548" elapsed="0.004751"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.345433" elapsed="0.004893"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:20:37.343475" elapsed="0.006904"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.343210" elapsed="0.007197"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.343194" elapsed="0.007237"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.350805" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.350487" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.350470" elapsed="0.000415"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-26T00:20:37.339577" elapsed="0.011353"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:20:37.331414" elapsed="0.019575"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.354052" 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-04-26T00:20:37.353679" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.354528" 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-04-26T00:20:37.354230" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.354597" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.354747" 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-04-26T00:20:37.353285" elapsed="0.001486"/>
</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-04-26T00:20:37.355091" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.354928" elapsed="0.000221"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.354820" elapsed="0.000353"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.351243" elapsed="0.003981"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-26T00:20:37.319365" elapsed="0.035919"/>
</kw>
<doc>Clear data after stoping all members and then restart all members.</doc>
<status status="PASS" start="2026-04-26T00:20:37.295328" elapsed="0.060041"/>
</kw>
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-26T00:20:37.357737" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-26T00:20:37.357486" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.358944" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.358839" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.358819" elapsed="0.000190"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.363256" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.363151" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.363133" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.364324" 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-04-26T00:20:37.363935" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.364783" 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-04-26T00:20:37.364503" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.364852" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.365001" 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-04-26T00:20:37.363554" elapsed="0.001470"/>
</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-04-26T00:20:37.365368" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.365603" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.365465" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.365448" elapsed="0.000227"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.365217" elapsed="0.000481"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.365074" elapsed="0.000647"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:20:37.362800" elapsed="0.002973"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-26T00:20:37.358560" elapsed="0.007266"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:20:37.358134" elapsed="0.007736"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-26T00:20:37.355555" elapsed="0.010365"/>
</kw>
<doc>Clear data and set loging.</doc>
<status status="PASS" start="2026-04-26T00:20:37.295073" elapsed="0.070891"/>
</kw>
<kw name="Setup_Netty_Replication" owner="NettyReplication">
<kw name="Open_Source_Connection" owner="NettyReplication">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.367702" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.367591" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.367569" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-26T00:20:37.368131" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.367904" elapsed="0.000335">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.368421" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.368592" elapsed="0.000019"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.368762" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.368985" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.368851" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.368834" elapsed="0.000225"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.369191" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.369456" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.369320" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.369303" elapsed="0.000227"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.369562" elapsed="0.000014"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<msg time="2026-04-26T00:20:37.373849" level="FAIL">Variable '${current_connection_index}' not found.</msg>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.370329" elapsed="0.003553">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.369816" elapsed="0.004130">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>config:edit org.opendaylight.mdsal.replicate.netty.source</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.367093" elapsed="0.006938">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:property-set enabled true</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.374386" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:update</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.374735" elapsed="0.000024"/>
</kw>
<arg>${source_member_index}</arg>
<doc>Open source part of netty replicate connection on specific node.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.366594" elapsed="0.008260">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<for flavor="IN">
<iter>
<kw name="Open_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<arg>source_member_index=${source_member_index}</arg>
<doc>Open sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.375122" elapsed="0.000022"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.374962" elapsed="0.000217"/>
</iter>
<var>${sink_member_index}</var>
<value>@{sink_members_indexes}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.374910" elapsed="0.000295"/>
</for>
<doc>Set up netty replication connections betwean source and sinks.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.366181" elapsed="0.009122">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>iterations=${5}</arg>
<arg>iter_j_offset=${0}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.375474" elapsed="0.000022"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>iterations=${5}</arg>
<arg>iter_j_offset=${5}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.375655" elapsed="0.000021"/>
</kw>
<kw name="Teardown_Test" type="TEARDOWN">
<for flavor="IN">
<iter>
<kw name="Close_Source_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close source part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.376429" elapsed="0.000024"/>
</kw>
<kw name="Close_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.376642" elapsed="0.000022"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.376240" elapsed="0.000456"/>
</iter>
<var>${sink_member_index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.376120" elapsed="0.000601"/>
</for>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.377804" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.377448" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.377430" elapsed="0.000456"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:20:37.378023" elapsed="0.000327"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.383039" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.382559" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-26T00:20:37.383293" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.383139" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.383121" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.383786" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.383495" elapsed="0.000319"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-26T00:20:37.384267" level="INFO">${reference} = mdsal_netty_replicate_txt_Replicate_Config_Update</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.383988" elapsed="0.000322"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-26T00:20:37.384678" level="INFO">${reference} = mdsal_netty_replicate_txt_replicate_config_update</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.384502" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.385192" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_config_update"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.384851" elapsed="0.000367"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.385692" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_config_update&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.385387" elapsed="0.000333"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.386328" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_config_update"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_config_update&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.385868" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.386815" level="INFO">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_config_update"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_config_update&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-26T00:20:37.386526" elapsed="0.000336"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-26T00:20:37.382242" elapsed="0.004675"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.377228" elapsed="0.009739"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.376894" elapsed="0.010114"/>
</kw>
<doc>Close all netty replication connections and show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.375927" elapsed="0.011124"/>
</kw>
<doc>Updating existing configuration on source node should be replicated on sink node.</doc>
<tag>3node</tag>
<tag>critical</tag>
<tag>netty-replicate</tag>
<status status="FAIL" start="2026-04-26T00:20:37.294607" elapsed="0.092481">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_config_update"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_config_update&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</test>
<test id="s1-t3" name="Replicte_Config_Deletion" line="39">
<kw name="Setup_Test" type="SETUP">
<kw name="Clear_Data_On_All_Nodes_And_Restart">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.392750" 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-04-26T00:20:37.392371" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.393214" 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-04-26T00:20:37.392931" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.393299" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:20:37.393455" level="INFO">${stop_index_list} = []</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.391990" elapsed="0.001489"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.394420" 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-04-26T00:20:37.394037" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.394878" 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-04-26T00:20:37.394599" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.394946" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.395095" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.393676" elapsed="0.001443"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.396562" 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-04-26T00:20:37.396175" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.397059" 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-04-26T00:20:37.396776" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.397129" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.397295" 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-04-26T00:20:37.395791" elapsed="0.001530"/>
</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-04-26T00:20:37.397645" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.397482" elapsed="0.000222"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.397372" elapsed="0.000358"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.395325" elapsed="0.002456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.398203" level="INFO">${updated_index_list} = []</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.397923" elapsed="0.000305"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.398388" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.398926" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.398821" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.398802" elapsed="0.000188"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.399265" elapsed="0.000037"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.399134" elapsed="0.000209"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.399026" elapsed="0.000342"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.402254" 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-04-26T00:20:37.401883" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.402730" 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-04-26T00:20:37.402450" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.402800" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.402947" 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-04-26T00:20:37.401521" elapsed="0.001450"/>
</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-04-26T00:20:37.403305" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.403128" elapsed="0.000237"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.403022" elapsed="0.000368"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.399553" elapsed="0.003887"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:20:37.403479" elapsed="0.000026"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-26T00:20:37.388479" elapsed="0.015119"/>
</kw>
<kw name="Clean_Journals_Data_And_Snapshots_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.406509" 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-04-26T00:20:37.406122" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.406968" 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-04-26T00:20:37.406689" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.407038" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.407185" 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-04-26T00:20:37.405763" elapsed="0.001447"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.407734" level="INFO">${command} = rm -rf "/tmp/karaf-0.23.2-SNAPSHOT/"*journal "/tmp/karaf-0.23.2-SNAPSHOT/snapshots" "/tmp/karaf-0.23.2-SNAPSHOT/data"</msg>
<var>${command}</var>
<arg>rm -rf "${karaf_home}/"*journal "${karaf_home}/snapshots" "${karaf_home}/data"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.407392" elapsed="0.000368"/>
</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-04-26T00:20:37.408145" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.407980" elapsed="0.000225"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.407844" elapsed="0.000386"/>
</for>
<doc>Delete journal and snapshots directories on every node listed (or all).
BEWARE: If only a subset of members is cleaned, this causes RetiredGenerationException in Carbon after the affected node re-start.
See https://bugs.opendaylight.org/show_bug.cgi?id=8138</doc>
<status status="PASS" start="2026-04-26T00:20:37.403812" elapsed="0.004485"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.419118" level="INFO">${base_command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.418752" elapsed="0.000393"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.419683" level="INFO">${command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.419328" elapsed="0.000381"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:20:37.420112" level="INFO">${epoch} = 1777162837.420048</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-26T00:20:37.419864" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.420717" level="INFO">${gc_filepath} = /tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.420048.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.420325" elapsed="0.000418"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.421266" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.420048.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.420905" elapsed="0.000403"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.422746" 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-04-26T00:20:37.422377" elapsed="0.000395"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.423204" 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-04-26T00:20:37.422925" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.423292" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:20:37.423446" 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-04-26T00:20:37.422006" elapsed="0.001464"/>
</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-04-26T00:20:37.423788" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.423627" elapsed="0.000220"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.423521" elapsed="0.000351"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.421510" elapsed="0.002413"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.434199" 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-04-26T00:20:37.433824" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.434683" 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-04-26T00:20:37.434398" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.434754" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.434904" 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-04-26T00:20:37.433462" elapsed="0.001466"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.435370" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.435502" elapsed="0.000015"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.435465" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.435446" elapsed="0.000116"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.435733" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.435135" elapsed="0.000651"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.434979" elapsed="0.000833"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-26T00:20:37.433066" elapsed="0.002800"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.432772" elapsed="0.003125"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.432752" elapsed="0.003168"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.437523" 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-04-26T00:20:37.436997" elapsed="0.000553"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.438032" 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-04-26T00:20:37.437716" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.438102" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:20:37.438255" 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-04-26T00:20:37.436637" elapsed="0.001679"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.438651" elapsed="0.000024"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.442296" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.438489" elapsed="0.003874"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.438369" elapsed="0.004021"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:20:37.436252" elapsed="0.006191"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.436002" elapsed="0.006470"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.435985" elapsed="0.006511"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.442868" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.442552" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.442536" elapsed="0.000414"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-26T00:20:37.432361" elapsed="0.010634"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:20:37.424103" elapsed="0.018952"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.446139" 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-04-26T00:20:37.445760" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.446623" 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-04-26T00:20:37.446335" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.446692" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.446842" 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-04-26T00:20:37.445363" elapsed="0.001503"/>
</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-04-26T00:20:37.447195" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.447025" elapsed="0.000229"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.446917" elapsed="0.000378"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.443330" elapsed="0.004017"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-26T00:20:37.412007" elapsed="0.035387"/>
</kw>
<doc>Clear data after stoping all members and then restart all members.</doc>
<status status="PASS" start="2026-04-26T00:20:37.388049" elapsed="0.059392"/>
</kw>
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-26T00:20:37.449859" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-26T00:20:37.449603" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.451075" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.450968" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.450949" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.455600" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.455493" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.455474" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.456663" 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-04-26T00:20:37.456266" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.457129" 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-04-26T00:20:37.456845" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.457199" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.457369" 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-04-26T00:20:37.455886" elapsed="0.001508"/>
</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-04-26T00:20:37.457728" 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-04-26T00:20:37.457966" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.457825" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.457808" elapsed="0.000233"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.457593" elapsed="0.000471"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.457445" elapsed="0.000643"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:20:37.455119" elapsed="0.003022"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-26T00:20:37.450689" elapsed="0.007506"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:20:37.450260" elapsed="0.007979"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-26T00:20:37.447669" elapsed="0.010640"/>
</kw>
<doc>Clear data and set loging.</doc>
<status status="PASS" start="2026-04-26T00:20:37.387786" elapsed="0.070570"/>
</kw>
<kw name="Setup_Netty_Replication" owner="NettyReplication">
<kw name="Open_Source_Connection" owner="NettyReplication">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.460145" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.460036" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.460016" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-26T00:20:37.460610" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.460372" elapsed="0.000352">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.460891" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.461061" elapsed="0.000021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.461232" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.461476" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.461341" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.461323" elapsed="0.000229"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.461684" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.461896" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.461765" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.461749" elapsed="0.000261"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.462044" elapsed="0.000014"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<msg time="2026-04-26T00:20:37.466314" level="FAIL">Variable '${current_connection_index}' not found.</msg>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.462811" elapsed="0.003537">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.462312" elapsed="0.004099">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>config:edit org.opendaylight.mdsal.replicate.netty.source</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.459504" elapsed="0.006990">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:property-set enabled true</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.466832" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:update</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.467176" elapsed="0.000023"/>
</kw>
<arg>${source_member_index}</arg>
<doc>Open source part of netty replicate connection on specific node.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.458976" elapsed="0.008339">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<for flavor="IN">
<iter>
<kw name="Open_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<arg>source_member_index=${source_member_index}</arg>
<doc>Open sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.467585" elapsed="0.000024"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.467423" elapsed="0.000221"/>
</iter>
<var>${sink_member_index}</var>
<value>@{sink_members_indexes}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.467372" elapsed="0.000298"/>
</for>
<doc>Set up netty replication connections betwean source and sinks.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.458583" elapsed="0.009171">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.467918" elapsed="0.000021"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>iterations=${5}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.468127" elapsed="0.000021"/>
</kw>
<kw name="Delete_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<doc>Request delete config on netty replicate source and verify changes has been made on both source and sink.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.468321" elapsed="0.000021"/>
</kw>
<kw name="Teardown_Test" type="TEARDOWN">
<for flavor="IN">
<iter>
<kw name="Close_Source_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close source part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.469066" elapsed="0.000023"/>
</kw>
<kw name="Close_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.469300" elapsed="0.000024"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.468893" elapsed="0.000463"/>
</iter>
<var>${sink_member_index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.468773" elapsed="0.000609"/>
</for>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.470490" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.470101" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.470082" elapsed="0.000497"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:20:37.470718" elapsed="0.000310"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.475803" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.475305" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-26T00:20:37.476082" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.475904" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.475886" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.476598" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.476300" elapsed="0.000325"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-26T00:20:37.477027" level="INFO">${reference} = mdsal_netty_replicate_txt_Replicte_Config_Deletion</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.476774" elapsed="0.000279"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-26T00:20:37.477427" level="INFO">${reference} = mdsal_netty_replicate_txt_replicte_config_deletion</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.477238" elapsed="0.000215"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.477939" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicte_config_deletion"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.477598" elapsed="0.000368"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.478432" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicte_config_deletion&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.478113" elapsed="0.000347"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.479052" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicte_config_deletion"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicte_config_deletion&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.478606" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.479559" level="INFO">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicte_config_deletion"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicte_config_deletion&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-26T00:20:37.479246" elapsed="0.000359"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-26T00:20:37.474997" elapsed="0.004662"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.469897" elapsed="0.009811"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.469556" elapsed="0.010192"/>
</kw>
<doc>Close all netty replication connections and show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.468582" elapsed="0.011209"/>
</kw>
<doc>Updating existing configuration on source node should be replicated on sink node.</doc>
<tag>3node</tag>
<tag>critical</tag>
<tag>netty-replicate</tag>
<status status="FAIL" start="2026-04-26T00:20:37.387331" elapsed="0.092496">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicte_config_deletion"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicte_config_deletion&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</test>
<test id="s1-t4" name="Replicate_Multiple_Changes_to_Config" line="46">
<kw name="Setup_Test" type="SETUP">
<kw name="Clear_Data_On_All_Nodes_And_Restart">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.485609" 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-04-26T00:20:37.485215" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.486071" 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-04-26T00:20:37.485789" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.486141" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:20:37.486315" level="INFO">${stop_index_list} = []</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.484852" elapsed="0.001489"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.487284" 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-04-26T00:20:37.486902" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.487745" 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-04-26T00:20:37.487463" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.487814" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.487964" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.486541" elapsed="0.001459"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.489430" 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-04-26T00:20:37.489042" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.489925" 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-04-26T00:20:37.489639" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.489997" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.490149" 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-04-26T00:20:37.488685" elapsed="0.001489"/>
</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-04-26T00:20:37.490515" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.490351" elapsed="0.000224"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.490225" elapsed="0.000376"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.488194" elapsed="0.002458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.491076" level="INFO">${updated_index_list} = []</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.490793" elapsed="0.000308"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.491244" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.491806" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.491703" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.491683" elapsed="0.000187"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.492176" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.492041" elapsed="0.000197"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.491906" elapsed="0.000357"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.495209" 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-04-26T00:20:37.494834" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.495696" 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-04-26T00:20:37.495410" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.495767" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:20:37.495919" 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-04-26T00:20:37.494471" elapsed="0.001473"/>
</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-04-26T00:20:37.496300" elapsed="0.000029"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.496118" elapsed="0.000247"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.496009" elapsed="0.000382"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.492477" elapsed="0.003965"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:20:37.496482" elapsed="0.000027"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-26T00:20:37.481289" elapsed="0.015316"/>
</kw>
<kw name="Clean_Journals_Data_And_Snapshots_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.499558" 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-04-26T00:20:37.499168" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.500094" 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-04-26T00:20:37.499740" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.500166" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.500333" 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-04-26T00:20:37.498804" elapsed="0.001560"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.500884" level="INFO">${command} = rm -rf "/tmp/karaf-0.23.2-SNAPSHOT/"*journal "/tmp/karaf-0.23.2-SNAPSHOT/snapshots" "/tmp/karaf-0.23.2-SNAPSHOT/data"</msg>
<var>${command}</var>
<arg>rm -rf "${karaf_home}/"*journal "${karaf_home}/snapshots" "${karaf_home}/data"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.500539" elapsed="0.000403"/>
</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-04-26T00:20:37.501285" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.501106" elapsed="0.000241"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.500996" elapsed="0.000377"/>
</for>
<doc>Delete journal and snapshots directories on every node listed (or all).
BEWARE: If only a subset of members is cleaned, this causes RetiredGenerationException in Carbon after the affected node re-start.
See https://bugs.opendaylight.org/show_bug.cgi?id=8138</doc>
<status status="PASS" start="2026-04-26T00:20:37.496824" elapsed="0.004601"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.512296" level="INFO">${base_command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.511902" elapsed="0.000422"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.512839" level="INFO">${command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.512487" elapsed="0.000378"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:20:37.513289" level="INFO">${epoch} = 1777162837.513203</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-26T00:20:37.513021" elapsed="0.000296"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.513869" level="INFO">${gc_filepath} = /tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.513203.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.513480" elapsed="0.000415"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.514438" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.513203.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.514055" elapsed="0.000409"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.515907" 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-04-26T00:20:37.515541" elapsed="0.000393"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.516407" 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-04-26T00:20:37.516109" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.516478" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.516628" 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-04-26T00:20:37.515163" elapsed="0.001489"/>
</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-04-26T00:20:37.517131" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.516807" elapsed="0.000384"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.516701" elapsed="0.000517"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.514662" elapsed="0.002621"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.527346" 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-04-26T00:20:37.526954" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.527806" 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-04-26T00:20:37.527525" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.527875" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.528035" 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-04-26T00:20:37.526593" elapsed="0.001467"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.528496" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.528624" elapsed="0.000015"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.528587" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.528569" elapsed="0.000149"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.528859" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.528266" elapsed="0.000646"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.528110" elapsed="0.000828"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-26T00:20:37.526187" elapsed="0.002804"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.525896" elapsed="0.003125"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.525876" elapsed="0.003167"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.530472" 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-04-26T00:20:37.530083" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.530930" 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-04-26T00:20:37.530651" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.530999" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.531149" 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-04-26T00:20:37.529724" elapsed="0.001449"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.531506" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.535124" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.531352" elapsed="0.003839"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.531223" elapsed="0.003994"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:20:37.529365" elapsed="0.005919"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.529096" elapsed="0.006218"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.529081" elapsed="0.006256"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.535708" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.535394" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.535377" elapsed="0.000411"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-26T00:20:37.525488" elapsed="0.010345"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:20:37.517439" elapsed="0.018453"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.538931" 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-04-26T00:20:37.538562" elapsed="0.000395"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.539406" 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-04-26T00:20:37.539109" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.539475" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.539625" 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-04-26T00:20:37.538154" elapsed="0.001495"/>
</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-04-26T00:20:37.539968" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.539806" elapsed="0.000243"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.539698" elapsed="0.000377"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.536158" elapsed="0.003969"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-26T00:20:37.505133" elapsed="0.035040"/>
</kw>
<doc>Clear data after stoping all members and then restart all members.</doc>
<status status="PASS" start="2026-04-26T00:20:37.480855" elapsed="0.059399"/>
</kw>
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-26T00:20:37.542626" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-26T00:20:37.542373" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.543849" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.543739" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.543720" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.548232" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.548122" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.548105" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.549296" 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-04-26T00:20:37.548902" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.549759" 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-04-26T00:20:37.549477" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.549828" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.549978" 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-04-26T00:20:37.548530" elapsed="0.001472"/>
</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-04-26T00:20:37.550352" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.550590" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.550451" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.550433" elapsed="0.000231"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.550203" elapsed="0.000484"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.550052" elapsed="0.000658"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:20:37.547742" elapsed="0.003020"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-26T00:20:37.543448" elapsed="0.007366"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:20:37.543024" elapsed="0.007834"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-26T00:20:37.540459" elapsed="0.010450"/>
</kw>
<doc>Clear data and set loging.</doc>
<status status="PASS" start="2026-04-26T00:20:37.480607" elapsed="0.070348"/>
</kw>
<kw name="Setup_Netty_Replication" owner="NettyReplication">
<kw name="Open_Source_Connection" owner="NettyReplication">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.552736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.552630" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.552610" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-26T00:20:37.553147" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.552936" elapsed="0.000319">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.553436" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.553650" elapsed="0.000020"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.553821" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.554041" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.553908" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.553892" elapsed="0.000222"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.554251" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.554516" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.554381" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.554364" elapsed="0.000224"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.554620" elapsed="0.000014"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<msg time="2026-04-26T00:20:37.558932" level="FAIL">Variable '${current_connection_index}' not found.</msg>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.555379" elapsed="0.003587">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.554868" elapsed="0.004161">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>config:edit org.opendaylight.mdsal.replicate.netty.source</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.552324" elapsed="0.006788">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:property-set enabled true</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.559462" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:update</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.559804" elapsed="0.000024"/>
</kw>
<arg>${source_member_index}</arg>
<doc>Open source part of netty replicate connection on specific node.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.551590" elapsed="0.008329">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<for flavor="IN">
<iter>
<kw name="Open_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<arg>source_member_index=${source_member_index}</arg>
<doc>Open sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.560197" elapsed="0.000023"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.560036" elapsed="0.000218"/>
</iter>
<var>${sink_member_index}</var>
<value>@{sink_members_indexes}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.559974" elapsed="0.000320"/>
</for>
<doc>Set up netty replication connections betwean source and sinks.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.551181" elapsed="0.009199">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping_1}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.560543" elapsed="0.000022"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>iterations=${5}</arg>
<arg>iter_j_offset=${0}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.560724" elapsed="0.000021"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping_2}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.560899" elapsed="0.000020"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>iterations=${7}</arg>
<arg>iter_j_offset=${0}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.561076" elapsed="0.000022"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping_2_updated}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.561249" elapsed="0.000033"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>iterations=${7}</arg>
<arg>iter_j_offset=${2}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.561438" elapsed="0.000020"/>
</kw>
<kw name="Delete_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<doc>Request delete config on netty replicate source and verify changes has been made on both source and sink.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.561615" elapsed="0.000021"/>
</kw>
<kw name="Teardown_Test" type="TEARDOWN">
<for flavor="IN">
<iter>
<kw name="Close_Source_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close source part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.562370" elapsed="0.000024"/>
</kw>
<kw name="Close_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.562581" elapsed="0.000022"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.562172" elapsed="0.000462"/>
</iter>
<var>${sink_member_index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.562053" elapsed="0.000607"/>
</for>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.565106" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.563387" elapsed="0.001783"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.563368" elapsed="0.001826"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:20:37.565353" elapsed="0.000317"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.570196" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.569720" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-26T00:20:37.570495" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.570352" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.570332" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.570994" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.570697" elapsed="0.000324"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-26T00:20:37.571442" level="INFO">${reference} = mdsal_netty_replicate_txt_Replicate_Multiple_Changes_to_Config</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.571171" elapsed="0.000297"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-26T00:20:37.571792" level="INFO">${reference} = mdsal_netty_replicate_txt_replicate_multiple_changes_to_config</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.571620" elapsed="0.000198"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.572346" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_multiple_changes_to_config"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.571963" elapsed="0.000411"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.572826" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_multiple_changes_to_config&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.572522" elapsed="0.000332"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.573461" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_multiple_changes_to_config"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_multiple_changes_to_config&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.573000" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.573949" level="INFO">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_multiple_changes_to_config"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_multiple_changes_to_config&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-26T00:20:37.573659" elapsed="0.000337"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-26T00:20:37.569427" elapsed="0.004623"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.563164" elapsed="0.010935"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.562832" elapsed="0.011309"/>
</kw>
<doc>Close all netty replication connections and show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.561863" elapsed="0.012322"/>
</kw>
<doc>CRUD configuration changes done on source node should be replicated on sink node.</doc>
<tag>3node</tag>
<tag>critical</tag>
<tag>netty-replicate</tag>
<status status="FAIL" start="2026-04-26T00:20:37.480093" elapsed="0.094129">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_multiple_changes_to_config"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_multiple_changes_to_config&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</test>
<test id="s1-t5" name="Replicate_Multiple_Changes_to_Multiple_Sinks" line="57">
<kw name="Setup_Test" type="SETUP">
<kw name="Clear_Data_On_All_Nodes_And_Restart">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.579976" 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-04-26T00:20:37.579601" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.580487" 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-04-26T00:20:37.580185" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.580558" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:20:37.580712" level="INFO">${stop_index_list} = []</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.579221" elapsed="0.001515"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.581686" 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-04-26T00:20:37.581318" elapsed="0.000394"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.582175" 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-04-26T00:20:37.581895" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.582244" elapsed="0.000043"/>
</return>
<msg time="2026-04-26T00:20:37.582412" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.580935" elapsed="0.001502"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.583838" 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-04-26T00:20:37.583470" elapsed="0.000394"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.584327" 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-04-26T00:20:37.584015" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.584398" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.584550" 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-04-26T00:20:37.583097" elapsed="0.001477"/>
</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-04-26T00:20:37.584896" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.584732" elapsed="0.000222"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.584624" elapsed="0.000356"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.582630" elapsed="0.002401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.585657" level="INFO">${updated_index_list} = []</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.585175" elapsed="0.000508"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.585830" elapsed="0.000192"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.586195" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.586093" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.586074" elapsed="0.000184"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.586553" elapsed="0.000020"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.586420" elapsed="0.000194"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.586311" elapsed="0.000328"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.589564" 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-04-26T00:20:37.589163" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.590024" 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-04-26T00:20:37.589743" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.590093" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.590243" 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-04-26T00:20:37.588799" elapsed="0.001468"/>
</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-04-26T00:20:37.590603" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.590440" elapsed="0.000221"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.590333" elapsed="0.000353"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.586824" elapsed="0.003913"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:20:37.590775" elapsed="0.000026"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-26T00:20:37.575648" elapsed="0.015248"/>
</kw>
<kw name="Clean_Journals_Data_And_Snapshots_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.593848" 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-04-26T00:20:37.593479" elapsed="0.000395"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.594365" 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-04-26T00:20:37.594063" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.594436" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.594588" 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-04-26T00:20:37.593095" elapsed="0.001518"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.595121" level="INFO">${command} = rm -rf "/tmp/karaf-0.23.2-SNAPSHOT/"*journal "/tmp/karaf-0.23.2-SNAPSHOT/snapshots" "/tmp/karaf-0.23.2-SNAPSHOT/data"</msg>
<var>${command}</var>
<arg>rm -rf "${karaf_home}/"*journal "${karaf_home}/snapshots" "${karaf_home}/data"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.594779" elapsed="0.000369"/>
</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-04-26T00:20:37.595485" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.595320" elapsed="0.000224"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.595198" elapsed="0.000371"/>
</for>
<doc>Delete journal and snapshots directories on every node listed (or all).
BEWARE: If only a subset of members is cleaned, this causes RetiredGenerationException in Carbon after the affected node re-start.
See https://bugs.opendaylight.org/show_bug.cgi?id=8138</doc>
<status status="PASS" start="2026-04-26T00:20:37.591113" elapsed="0.004507"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.606526" level="INFO">${base_command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.606144" elapsed="0.000409"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.607071" level="INFO">${command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.606716" elapsed="0.000381"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:20:37.607503" level="INFO">${epoch} = 1777162837.607439</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-26T00:20:37.607251" elapsed="0.000278"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.608110" level="INFO">${gc_filepath} = /tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.607439.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.607690" elapsed="0.000446"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.608679" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.607439.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.608312" elapsed="0.000393"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.610139" 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-04-26T00:20:37.609777" elapsed="0.000388"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.610618" 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-04-26T00:20:37.610337" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.610687" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.610836" 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-04-26T00:20:37.609421" elapsed="0.001438"/>
</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-04-26T00:20:37.611361" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.611013" elapsed="0.000409"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.610908" elapsed="0.000543"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.608904" elapsed="0.002599"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.621569" 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-04-26T00:20:37.621181" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.622032" 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-04-26T00:20:37.621749" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.622138" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:20:37.622304" 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-04-26T00:20:37.620820" elapsed="0.001510"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.622754" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.622885" elapsed="0.000015"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.622847" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.622829" elapsed="0.000117"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.623081" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.622538" elapsed="0.000596"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.622381" elapsed="0.000778"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-26T00:20:37.620441" elapsed="0.002771"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.620138" elapsed="0.003104"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.620118" elapsed="0.003147"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.624723" 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-04-26T00:20:37.624351" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.625191" 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-04-26T00:20:37.624907" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.625263" elapsed="0.000047"/>
</return>
<msg time="2026-04-26T00:20:37.625435" 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-04-26T00:20:37.623951" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.625778" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.629377" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.625623" elapsed="0.003822"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.625510" elapsed="0.003961"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:20:37.623590" elapsed="0.005935"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.623341" elapsed="0.006212"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.623324" elapsed="0.006253"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.629948" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.629634" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.629617" elapsed="0.000412"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-26T00:20:37.619716" elapsed="0.010359"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:20:37.611655" elapsed="0.018479"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.633198" 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-04-26T00:20:37.632825" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.633678" 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-04-26T00:20:37.633394" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.633749" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.633899" 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-04-26T00:20:37.632431" elapsed="0.001491"/>
</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-04-26T00:20:37.634301" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.634117" elapsed="0.000245"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.634006" elapsed="0.000382"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.630404" elapsed="0.004036"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-26T00:20:37.599361" elapsed="0.035125"/>
</kw>
<doc>Clear data after stoping all members and then restart all members.</doc>
<status status="PASS" start="2026-04-26T00:20:37.575216" elapsed="0.059316"/>
</kw>
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-26T00:20:37.636882" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-26T00:20:37.636631" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.638087" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.637982" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.637962" elapsed="0.000190"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.642438" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.642333" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.642314" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.643466" 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-04-26T00:20:37.643079" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.643927" 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-04-26T00:20:37.643646" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.643995" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.644163" 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-04-26T00:20:37.642717" elapsed="0.001471"/>
</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-04-26T00:20:37.644533" 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-04-26T00:20:37.644765" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.644628" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.644611" elapsed="0.000227"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.644399" elapsed="0.000461"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.644238" elapsed="0.000646"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:20:37.641969" elapsed="0.002965"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-26T00:20:37.637704" elapsed="0.007283"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:20:37.637295" elapsed="0.007736"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-26T00:20:37.634718" elapsed="0.010363"/>
</kw>
<doc>Clear data and set loging.</doc>
<status status="PASS" start="2026-04-26T00:20:37.574979" elapsed="0.070147"/>
</kw>
<kw name="Setup_Netty_Replication" owner="NettyReplication">
<kw name="Open_Source_Connection" owner="NettyReplication">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.647208" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.647091" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.647068" elapsed="0.000232"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-26T00:20:37.647669" level="FAIL">Dictionary does not contain key 'source_memeber_index=1'.</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.647444" elapsed="0.000328">Dictionary does not contain key 'source_memeber_index=1'.</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.647939" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.648140" elapsed="0.000064"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.648385" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.648614" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.648478" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.648461" elapsed="0.000228"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.648823" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.649037" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.648904" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.648888" elapsed="0.000223"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.649142" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<msg time="2026-04-26T00:20:37.653442" level="FAIL">Variable '${current_connection_index}' not found.</msg>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.649912" elapsed="0.003563">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.649408" elapsed="0.004131">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>config:edit org.opendaylight.mdsal.replicate.netty.source</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.646582" elapsed="0.007040">Dictionary does not contain key 'source_memeber_index=1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:property-set enabled true</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.653958" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:update</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.654312" elapsed="0.000024"/>
</kw>
<arg>${source_member_index}</arg>
<doc>Open source part of netty replicate connection on specific node.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.646031" elapsed="0.008397">Dictionary does not contain key 'source_memeber_index=1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<for flavor="IN">
<iter>
<kw name="Open_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<arg>source_member_index=${source_member_index}</arg>
<doc>Open sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.654698" elapsed="0.000023"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.654538" elapsed="0.000218"/>
</iter>
<var>${sink_member_index}</var>
<value>@{sink_members_indexes}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.654485" elapsed="0.000297"/>
</for>
<arg>source_memeber_index=${DEFAULT_NETTY_SOURCE_NODE_INDEX}</arg>
<arg>sink_members_indexes=@{MULTIPLE_SINK_NODES_INDEXES}</arg>
<doc>Set up netty replication connections betwean source and sinks.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.645511" elapsed="0.009354">Dictionary does not contain key 'source_memeber_index=1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping_1}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.655029" elapsed="0.000020"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>sink_node_indexes=${MULTIPLE_SINK_NODES_INDEXES}</arg>
<arg>iterations=${5}</arg>
<arg>iter_j_offset=${0}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.655208" elapsed="0.000021"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping_2}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.655401" elapsed="0.000020"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>sink_node_indexes=${MULTIPLE_SINK_NODES_INDEXES}</arg>
<arg>iterations=${7}</arg>
<arg>iter_j_offset=${0}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.655573" elapsed="0.000021"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping_2_updated}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.655748" elapsed="0.000020"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>sink_node_indexes=${MULTIPLE_SINK_NODES_INDEXES}</arg>
<arg>iterations=${8}</arg>
<arg>iter_j_offset=${2}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.655917" elapsed="0.000021"/>
</kw>
<kw name="Delete_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<doc>Request delete config on netty replicate source and verify changes has been made on both source and sink.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.656119" elapsed="0.000021"/>
</kw>
<kw name="Teardown_Test" type="TEARDOWN">
<for flavor="IN">
<iter>
<kw name="Close_Source_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close source part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.656874" elapsed="0.000023"/>
</kw>
<kw name="Close_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.657083" elapsed="0.000022"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.656702" elapsed="0.000435"/>
</iter>
<var>${sink_member_index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.656582" elapsed="0.000611"/>
</for>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.658306" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.657934" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.657915" elapsed="0.000475"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:20:37.658529" elapsed="0.000311"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.663579" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.663058" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-26T00:20:37.663828" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.663685" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.663666" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.664378" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.664034" elapsed="0.000371"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-26T00:20:37.664818" level="INFO">${reference} = mdsal_netty_replicate_txt_Replicate_Multiple_Changes_to_Multiple_Sinks</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.664559" elapsed="0.000285"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-26T00:20:37.665172" level="INFO">${reference} = mdsal_netty_replicate_txt_replicate_multiple_changes_to_multiple_sinks</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.664999" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.665703" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_multiple_changes_to_multiple_sinks"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.665362" elapsed="0.000368"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.666183" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_multiple_changes_to_multiple_sinks&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.665879" elapsed="0.000332"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.666834" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_multiple_changes_to_multiple_sinks"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_multiple_changes_to_multiple_sinks&amp;order=bug_status"

Dictionary does not contain key 'source_memeber_index=1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.666380" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.667340" level="INFO">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_multiple_changes_to_multiple_sinks"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_multiple_changes_to_multiple_sinks&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-26T00:20:37.667032" elapsed="0.000356"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-26T00:20:37.662757" elapsed="0.004686"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.657728" elapsed="0.009766"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.657390" elapsed="0.010154"/>
</kw>
<doc>Close all netty replication connections and show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.656391" elapsed="0.011199"/>
</kw>
<doc>CRUD configuration changes done on source node should be replicated on multiple sink nodes.</doc>
<tag>3node</tag>
<tag>critical</tag>
<tag>netty-replicate</tag>
<status status="FAIL" start="2026-04-26T00:20:37.574470" elapsed="0.093158">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_replicate_multiple_changes_to_multiple_sinks"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_replicate_multiple_changes_to_multiple_sinks&amp;order=bug_status"

Dictionary does not contain key 'source_memeber_index=1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</test>
<test id="s1-t6" name="Sink_Catch_Up_To_Changes_After_Opening_Connection" line="82">
<kw name="Setup_Test" type="SETUP">
<kw name="Clear_Data_On_All_Nodes_And_Restart">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.673593" 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-04-26T00:20:37.673152" elapsed="0.000468"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.674061" 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-04-26T00:20:37.673774" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.674132" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:20:37.674303" level="INFO">${stop_index_list} = []</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.672785" elapsed="0.001543"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.675262" 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-04-26T00:20:37.674893" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.675738" 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-04-26T00:20:37.675456" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.675807" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.675955" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.674528" elapsed="0.001452"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.677415" 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-04-26T00:20:37.677026" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.677873" 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-04-26T00:20:37.677593" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.677942" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.678092" 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-04-26T00:20:37.676670" elapsed="0.001446"/>
</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-04-26T00:20:37.678460" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.678293" elapsed="0.000227"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.678167" elapsed="0.000379"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.676187" elapsed="0.002410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.679022" level="INFO">${updated_index_list} = []</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.678740" elapsed="0.000307"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.679191" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.679764" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.679661" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.679642" elapsed="0.000186"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.680132" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.679972" elapsed="0.000222"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.679863" elapsed="0.000357"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.683136" 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-04-26T00:20:37.682764" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.683615" 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-04-26T00:20:37.683330" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.683685" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.683834" 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-04-26T00:20:37.682401" elapsed="0.001456"/>
</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-04-26T00:20:37.684231" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.684051" elapsed="0.000255"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.683942" elapsed="0.000390"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.680424" elapsed="0.003960"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:20:37.684424" elapsed="0.000026"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-26T00:20:37.669198" elapsed="0.015346"/>
</kw>
<kw name="Clean_Journals_Data_And_Snapshots_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.687487" 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-04-26T00:20:37.687103" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.687946" 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-04-26T00:20:37.687666" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.688014" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.688198" 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-04-26T00:20:37.686743" elapsed="0.001480"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.688760" level="INFO">${command} = rm -rf "/tmp/karaf-0.23.2-SNAPSHOT/"*journal "/tmp/karaf-0.23.2-SNAPSHOT/snapshots" "/tmp/karaf-0.23.2-SNAPSHOT/data"</msg>
<var>${command}</var>
<arg>rm -rf "${karaf_home}/"*journal "${karaf_home}/snapshots" "${karaf_home}/data"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.688406" elapsed="0.000380"/>
</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-04-26T00:20:37.689105" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.688942" elapsed="0.000223"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.688836" elapsed="0.000354"/>
</for>
<doc>Delete journal and snapshots directories on every node listed (or all).
BEWARE: If only a subset of members is cleaned, this causes RetiredGenerationException in Carbon after the affected node re-start.
See https://bugs.opendaylight.org/show_bug.cgi?id=8138</doc>
<status status="PASS" start="2026-04-26T00:20:37.684763" elapsed="0.004478"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.700220" level="INFO">${base_command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.699814" elapsed="0.000432"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.700777" level="INFO">${command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.700424" elapsed="0.000379"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:20:37.701206" level="INFO">${epoch} = 1777162837.701139</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-26T00:20:37.700959" elapsed="0.000272"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.701804" level="INFO">${gc_filepath} = /tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.701139.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.701413" elapsed="0.000417"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.702368" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.701139.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.701989" elapsed="0.000405"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.703828" 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-04-26T00:20:37.703463" elapsed="0.000392"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.704336" 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-04-26T00:20:37.704007" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.704406" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.704555" 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-04-26T00:20:37.703090" elapsed="0.001489"/>
</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-04-26T00:20:37.704938" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.704774" elapsed="0.000223"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.704663" elapsed="0.000359"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.702594" elapsed="0.002480"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.715353" 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-04-26T00:20:37.714965" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.715813" 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-04-26T00:20:37.715532" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.715882" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.716033" 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-04-26T00:20:37.714603" elapsed="0.001454"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.716510" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.716640" elapsed="0.000016"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.716602" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.716584" elapsed="0.000118"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.716836" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.716292" elapsed="0.000596"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.716121" elapsed="0.000793"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-26T00:20:37.714204" elapsed="0.002763"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.713908" elapsed="0.003090"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.713888" elapsed="0.003132"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.718446" 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-04-26T00:20:37.718060" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.718905" 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-04-26T00:20:37.718625" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.718973" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.719123" 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-04-26T00:20:37.717701" elapsed="0.001446"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.719490" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.723116" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.719331" elapsed="0.003851"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.719197" elapsed="0.004012"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:20:37.717339" elapsed="0.005923"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.717073" elapsed="0.006238"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.717058" elapsed="0.006277"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.723706" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.723391" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.723375" elapsed="0.000411"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-26T00:20:37.713496" elapsed="0.010336"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:20:37.705227" elapsed="0.018698"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.726970" 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-04-26T00:20:37.726598" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.727450" 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-04-26T00:20:37.727149" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.727520" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.727668" 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-04-26T00:20:37.726193" elapsed="0.001500"/>
</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-04-26T00:20:37.728013" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.727850" elapsed="0.000221"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.727742" elapsed="0.000374"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.724192" elapsed="0.003978"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-26T00:20:37.692997" elapsed="0.035220"/>
</kw>
<doc>Clear data after stoping all members and then restart all members.</doc>
<status status="PASS" start="2026-04-26T00:20:37.668778" elapsed="0.059485"/>
</kw>
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-26T00:20:37.730631" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-26T00:20:37.730377" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.731840" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.731734" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.731715" elapsed="0.000191"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.736208" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.736077" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.736059" elapsed="0.000233"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.737239" 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-04-26T00:20:37.736869" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.737713" 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-04-26T00:20:37.737432" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.737782" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.737929" 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-04-26T00:20:37.736507" elapsed="0.001446"/>
</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-04-26T00:20:37.738293" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.738528" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.738390" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.738373" elapsed="0.000229"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.738145" elapsed="0.000479"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.738002" elapsed="0.000645"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:20:37.735726" elapsed="0.002973"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-26T00:20:37.731455" elapsed="0.007297"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:20:37.731031" elapsed="0.007765"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-26T00:20:37.728464" elapsed="0.010418"/>
</kw>
<doc>Clear data and set loging.</doc>
<status status="PASS" start="2026-04-26T00:20:37.668537" elapsed="0.070392"/>
</kw>
<kw name="Open_Source_Connection" owner="NettyReplication">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.740045" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.739939" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.739921" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-26T00:20:37.740676" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.740263" elapsed="0.000513">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.740941" elapsed="0.000021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.741110" elapsed="0.000019"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.741293" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.741517" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.741384" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.741368" elapsed="0.000222"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.741730" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.741940" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.741810" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.741794" elapsed="0.000218"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.742044" elapsed="0.000014"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<msg time="2026-04-26T00:20:37.746361" level="FAIL">Variable '${current_connection_index}' not found.</msg>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.742802" elapsed="0.003594">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.742306" elapsed="0.004154">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>config:edit org.opendaylight.mdsal.replicate.netty.source</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.739641" elapsed="0.006898">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:property-set enabled true</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.746876" elapsed="0.000024"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:update</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.747222" elapsed="0.000023"/>
</kw>
<doc>Open source part of netty replicate connection on specific node.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.739129" elapsed="0.008222">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.747506" elapsed="0.000021"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>sink_node_indexes=@{EMPTY}</arg>
<arg>iterations=${5}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.747692" elapsed="0.000022"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${netty_sink_session_alias}</var>
<arg>member_index=@{DEFAULT_NETTY_SINK_NODE_INDEXES}[0]</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.747887" elapsed="0.000022"/>
</kw>
<kw name="Verify_Config_Is_Not_Present">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>session=${netty_sink_session_alias}</arg>
<arg>wait_time=5s</arg>
<doc>Verify config is not present on the target node datastore by using templated request. Should get return code 404 or 409.
removal - Retries until config is not present (for cases of cofig deletion when config migh be present at begining, but disapears later)
wait_time - Repeatedly checks for specific amount of time if config does not appear (for cases of config addition when config is not present, but might appear after some time)</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.748099" elapsed="0.000035"/>
</kw>
<kw name="Open_Sink_Connection" owner="NettyReplication">
<doc>Open sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.748362" elapsed="0.000023"/>
</kw>
<kw name="Verify_Config_Is_Present">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>session=${netty_sink_session_alias}</arg>
<arg>iterations=${5}</arg>
<doc>Verify config is present on target node datastore by using templated request.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.748500" elapsed="0.000020"/>
</kw>
<kw name="Teardown_Test" type="TEARDOWN">
<for flavor="IN">
<iter>
<kw name="Close_Source_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close source part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.749304" elapsed="0.000023"/>
</kw>
<kw name="Close_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.749517" elapsed="0.000022"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.749111" elapsed="0.000460"/>
</iter>
<var>${sink_member_index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.748986" elapsed="0.000611"/>
</for>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.750695" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.750326" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.750307" elapsed="0.000469"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:20:37.750914" elapsed="0.000308"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.755969" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.755495" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-26T00:20:37.756224" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.756070" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.756052" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.756735" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.756440" elapsed="0.000321"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-26T00:20:37.757161" level="INFO">${reference} = mdsal_netty_replicate_txt_Sink_Catch_Up_To_Changes_After_Opening_Connection</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.756909" elapsed="0.000278"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-26T00:20:37.757527" level="INFO">${reference} = mdsal_netty_replicate_txt_sink_catch_up_to_changes_after_opening_connection</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.757354" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.758036" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_sink_catch_up_to_changes_after_opening_connection"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.757698" elapsed="0.000364"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.758535" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_sink_catch_up_to_changes_after_opening_connection&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.758209" elapsed="0.000353"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.759152" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_sink_catch_up_to_changes_after_opening_connection"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_sink_catch_up_to_changes_after_opening_connection&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.758708" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.759652" level="INFO">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_sink_catch_up_to_changes_after_opening_connection"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_sink_catch_up_to_changes_after_opening_connection&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-26T00:20:37.759362" elapsed="0.000336"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-26T00:20:37.755186" elapsed="0.004565"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.750109" elapsed="0.009692"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.749773" elapsed="0.010068"/>
</kw>
<doc>Close all netty replication connections and show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.748761" elapsed="0.011123"/>
</kw>
<doc>After opening sink part of connection, sink should catch up to changes made on the source node, which were made before opening connection.</doc>
<tag>3node</tag>
<tag>critical</tag>
<tag>netty-replicate</tag>
<status status="FAIL" start="2026-04-26T00:20:37.667878" elapsed="0.092040">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_sink_catch_up_to_changes_after_opening_connection"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_sink_catch_up_to_changes_after_opening_connection&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</test>
<test id="s1-t7" name="Reconnect_After_Lost_Connection" line="99">
<kw name="Setup_Test" type="SETUP">
<kw name="Clear_Data_On_All_Nodes_And_Restart">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.765776" 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-04-26T00:20:37.765391" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.766238" 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-04-26T00:20:37.765955" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.766323" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:20:37.766477" level="INFO">${stop_index_list} = []</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.765015" elapsed="0.001487"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.767465" 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-04-26T00:20:37.767072" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.767920" 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-04-26T00:20:37.767641" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.767988" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.768160" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.766701" elapsed="0.001484"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.769656" 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-04-26T00:20:37.769263" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.770112" 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-04-26T00:20:37.769833" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.770180" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.770345" 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-04-26T00:20:37.768892" elapsed="0.001478"/>
</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-04-26T00:20:37.770693" elapsed="0.000028"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.770529" elapsed="0.000227"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.770420" elapsed="0.000361"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.768411" elapsed="0.002421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.771253" level="INFO">${updated_index_list} = []</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.770974" elapsed="0.000319"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.771438" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.771969" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.771866" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.771847" elapsed="0.000185"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.772339" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.772190" elapsed="0.000212"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.772068" elapsed="0.000359"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.775361" 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-04-26T00:20:37.774973" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.775822" 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-04-26T00:20:37.775542" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.775891" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.776042" 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-04-26T00:20:37.774607" elapsed="0.001490"/>
</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-04-26T00:20:37.776465" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.776300" elapsed="0.000224"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.776175" elapsed="0.000374"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.772615" elapsed="0.003985"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:20:37.776639" elapsed="0.000026"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-26T00:20:37.761450" elapsed="0.015310"/>
</kw>
<kw name="Clean_Journals_Data_And_Snapshots_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.779706" 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-04-26T00:20:37.779331" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.780181" 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-04-26T00:20:37.779886" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.780251" elapsed="0.000043"/>
</return>
<msg time="2026-04-26T00:20:37.780419" 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-04-26T00:20:37.778946" elapsed="0.001497"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.780949" level="INFO">${command} = rm -rf "/tmp/karaf-0.23.2-SNAPSHOT/"*journal "/tmp/karaf-0.23.2-SNAPSHOT/snapshots" "/tmp/karaf-0.23.2-SNAPSHOT/data"</msg>
<var>${command}</var>
<arg>rm -rf "${karaf_home}/"*journal "${karaf_home}/snapshots" "${karaf_home}/data"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.780609" elapsed="0.000366"/>
</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-04-26T00:20:37.781311" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.781131" elapsed="0.000240"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.781025" elapsed="0.000371"/>
</for>
<doc>Delete journal and snapshots directories on every node listed (or all).
BEWARE: If only a subset of members is cleaned, this causes RetiredGenerationException in Carbon after the affected node re-start.
See https://bugs.opendaylight.org/show_bug.cgi?id=8138</doc>
<status status="PASS" start="2026-04-26T00:20:37.776977" elapsed="0.004470"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.792326" level="INFO">${base_command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.791912" elapsed="0.000442"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.792872" level="INFO">${command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.792516" elapsed="0.000382"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:20:37.793301" level="INFO">${epoch} = 1777162837.793223</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-26T00:20:37.793052" elapsed="0.000276"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.793881" level="INFO">${gc_filepath} = /tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.793223.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.793488" elapsed="0.000419"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.794449" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.793223.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.794068" elapsed="0.000407"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.795941" 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-04-26T00:20:37.795568" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.796436" 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-04-26T00:20:37.796120" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.796505" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.796661" 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-04-26T00:20:37.795179" elapsed="0.001544"/>
</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-04-26T00:20:37.798493" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.796886" elapsed="0.001670"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.796777" elapsed="0.001805"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.794674" elapsed="0.003961"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.808697" 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-04-26T00:20:37.808323" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.809160" 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-04-26T00:20:37.808877" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.809231" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.809402" 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-04-26T00:20:37.807914" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.809848" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.809977" elapsed="0.000014"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.809939" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.809922" elapsed="0.000114"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.810169" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.809633" elapsed="0.000588"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.809478" elapsed="0.000767"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-26T00:20:37.807538" elapsed="0.002776"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.807231" elapsed="0.003115"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.807211" elapsed="0.003157"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.811787" 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-04-26T00:20:37.811416" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.812259" 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-04-26T00:20:37.811965" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.812345" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.812495" 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-04-26T00:20:37.811031" elapsed="0.001488"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.812838" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.816463" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.812683" elapsed="0.003847"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.812569" elapsed="0.003988"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:20:37.810670" elapsed="0.005940"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.810421" elapsed="0.006217"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.810405" elapsed="0.006256"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.817028" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.816716" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.816700" elapsed="0.000408"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-26T00:20:37.806821" elapsed="0.010331"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:20:37.798789" elapsed="0.018459"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.820309" 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-04-26T00:20:37.819907" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.820774" 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-04-26T00:20:37.820490" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.820843" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.820992" 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-04-26T00:20:37.819516" elapsed="0.001499"/>
</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-04-26T00:20:37.821360" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.821174" elapsed="0.000245"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.821066" elapsed="0.000378"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.817520" elapsed="0.003975"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-26T00:20:37.785177" elapsed="0.036364"/>
</kw>
<doc>Clear data after stoping all members and then restart all members.</doc>
<status status="PASS" start="2026-04-26T00:20:37.761025" elapsed="0.060561"/>
</kw>
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-26T00:20:37.823906" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-26T00:20:37.823658" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.825138" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.825032" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.825013" elapsed="0.000190"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.829476" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.829372" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.829354" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.830506" 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-04-26T00:20:37.830115" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.830964" 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-04-26T00:20:37.830684" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.831032" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.831180" 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-04-26T00:20:37.829752" elapsed="0.001452"/>
</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-04-26T00:20:37.831548" 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-04-26T00:20:37.831780" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.831643" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.831626" elapsed="0.000227"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.831415" elapsed="0.000461"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.831253" elapsed="0.000646"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:20:37.829011" elapsed="0.002939"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-26T00:20:37.824755" elapsed="0.007283"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:20:37.824349" elapsed="0.007734"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-26T00:20:37.821769" elapsed="0.010364"/>
</kw>
<doc>Clear data and set loging.</doc>
<status status="PASS" start="2026-04-26T00:20:37.760786" elapsed="0.071418"/>
</kw>
<kw name="Setup_Netty_Replication" owner="NettyReplication">
<kw name="Open_Source_Connection" owner="NettyReplication">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.833930" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.833819" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.833798" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-26T00:20:37.834361" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.834134" elapsed="0.000319">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.834615" elapsed="0.000021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.834783" elapsed="0.000020"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.834952" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.835172" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.835041" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.835024" elapsed="0.000220"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.835392" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.835602" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.835473" elapsed="0.000178"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.835457" elapsed="0.000216"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.835705" elapsed="0.000014"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<msg time="2026-04-26T00:20:37.839941" level="FAIL">Variable '${current_connection_index}' not found.</msg>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.836465" elapsed="0.003509">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.835945" elapsed="0.004093">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>config:edit org.opendaylight.mdsal.replicate.netty.source</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.833340" elapsed="0.006778">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:property-set enabled true</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.840497" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:update</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.840834" elapsed="0.000024"/>
</kw>
<arg>${source_member_index}</arg>
<doc>Open source part of netty replicate connection on specific node.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.832824" elapsed="0.008126">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<for flavor="IN">
<iter>
<kw name="Open_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<arg>source_member_index=${source_member_index}</arg>
<doc>Open sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.841212" elapsed="0.000023"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.841055" elapsed="0.000228"/>
</iter>
<var>${sink_member_index}</var>
<value>@{sink_members_indexes}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.841005" elapsed="0.000305"/>
</for>
<doc>Set up netty replication connections betwean source and sinks.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.832438" elapsed="0.008957">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Isolate_Member_From_List_Or_All" owner="ClusterManagement">
<arg>@{DEFAULT_NETTY_SINK_NODE_INDEXES}[0]</arg>
<doc>If the list is empty, isolate member from all ODL instances. Otherwise, isolate member based on present indices.
The KW will return a list of available members: ${updated index_list}=${member_index_list}-${isolate_member_index}</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.841710" elapsed="0.000024"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.841885" elapsed="0.000020"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>sink_node_indexes=@{EMPTY}</arg>
<arg>iterations=${5}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.842059" elapsed="0.000020"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${netty_sink_session_alias}</var>
<arg>member_index=@{DEFAULT_NETTY_SINK_NODE_INDEXES}[0]</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.842304" elapsed="0.000024"/>
</kw>
<kw name="Verify_Config_Is_Not_Present">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>session=${netty_sink_session_alias}</arg>
<arg>wait_time=5s</arg>
<doc>Verify config is not present on the target node datastore by using templated request. Should get return code 404 or 409.
removal - Retries until config is not present (for cases of cofig deletion when config migh be present at begining, but disapears later)
wait_time - Repeatedly checks for specific amount of time if config does not appear (for cases of config addition when config is not present, but might appear after some time)</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.842519" elapsed="0.000021"/>
</kw>
<kw name="Rejoin_Member_From_List_Or_All" owner="ClusterManagement">
<arg>@{DEFAULT_NETTY_SINK_NODE_INDEXES}[0]</arg>
<doc>If the list is empty, rejoin member from all ODL instances. Otherwise, rejoin member based on present indices.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.842828" elapsed="0.000022"/>
</kw>
<kw name="Verify_Config_Is_Present">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>session=${netty_sink_session_alias}</arg>
<arg>iterations=${5}</arg>
<doc>Verify config is present on target node datastore by using templated request.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.842968" elapsed="0.000020"/>
</kw>
<kw name="Teardown_Isolation_Test" type="TEARDOWN">
<for flavor="IN">
<iter>
<kw name="Rejoin_Member_From_List_Or_All" owner="ClusterManagement">
<arg>${member_index}</arg>
<doc>If the list is empty, rejoin member from all ODL instances. Otherwise, rejoin member based on present indices.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.843797" elapsed="0.000024"/>
</kw>
<var name="${member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.843542" elapsed="0.000313"/>
</iter>
<var>${member_index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.843428" elapsed="0.000453"/>
</for>
<kw name="Teardown_Test">
<for flavor="IN">
<iter>
<kw name="Close_Source_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close source part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.844527" elapsed="0.000023"/>
</kw>
<kw name="Close_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.844736" elapsed="0.000022"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.844355" elapsed="0.000434"/>
</iter>
<var>${sink_member_index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.844216" elapsed="0.000597"/>
</for>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.846045" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.845689" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.845670" elapsed="0.000458"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:20:37.846266" elapsed="0.000325"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.851112" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.850642" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-26T00:20:37.851368" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.851212" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.851194" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.851859" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.851568" elapsed="0.000317"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-26T00:20:37.852319" level="INFO">${reference} = mdsal_netty_replicate_txt_Reconnect_After_Lost_Connection</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.852032" elapsed="0.000314"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-26T00:20:37.852668" level="INFO">${reference} = mdsal_netty_replicate_txt_reconnect_after_lost_connection</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.852498" elapsed="0.000195"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.853175" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_reconnect_after_lost_connection"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.852840" elapsed="0.000362"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.853837" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_reconnect_after_lost_connection&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.853517" elapsed="0.000373"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.854536" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_reconnect_after_lost_connection"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_reconnect_after_lost_connection&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.854052" elapsed="0.000575"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.855073" level="INFO">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_reconnect_after_lost_connection"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_reconnect_after_lost_connection&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-26T00:20:37.854777" elapsed="0.000344"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-26T00:20:37.850351" elapsed="0.004827"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.845485" elapsed="0.009745"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.844983" elapsed="0.010305"/>
</kw>
<doc>Close all netty replication connections and show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.844017" elapsed="0.011320"/>
</kw>
<doc>Tear down test when isolation is used. Additionally to traditional teardown resets iptables rules set during isolation.</doc>
<status status="PASS" start="2026-04-26T00:20:37.843218" elapsed="0.012166"/>
</kw>
<doc>Test if sink sucessfuly reconnects after lost connection and if changes made during lost connection are present on reconnected sink's datastore.</doc>
<tag>3node</tag>
<tag>critical</tag>
<tag>netty-replicate</tag>
<status status="FAIL" start="2026-04-26T00:20:37.760201" elapsed="0.095221">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_reconnect_after_lost_connection"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_reconnect_after_lost_connection&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</test>
<test id="s1-t8" name="Change_Replication_Source" line="118">
<kw name="Setup_Test" type="SETUP">
<kw name="Clear_Data_On_All_Nodes_And_Restart">
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.861301" 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-04-26T00:20:37.860900" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.861773" 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-04-26T00:20:37.861487" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.861844" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:20:37.862000" level="INFO">${stop_index_list} = []</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.860530" elapsed="0.001495"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.862983" 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-04-26T00:20:37.862611" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.863463" 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-04-26T00:20:37.863163" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.863533" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.863682" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-26T00:20:37.862228" elapsed="0.001479"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.865327" 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-04-26T00:20:37.864941" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.865789" 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-04-26T00:20:37.865508" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.865858" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.866007" 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-04-26T00:20:37.864416" elapsed="0.001615"/>
</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-04-26T00:20:37.866375" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.866192" elapsed="0.000242"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.866082" elapsed="0.000379"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.863904" elapsed="0.002608"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.866975" level="INFO">${updated_index_list} = []</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:20:37.866691" elapsed="0.000309"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.867146" elapsed="0.000211"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.867534" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.867430" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.867411" elapsed="0.000188"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.867880" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.867745" elapsed="0.000197"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.867635" elapsed="0.000332"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.870929" 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-04-26T00:20:37.870549" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.871414" 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-04-26T00:20:37.871111" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.871485" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.871636" 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-04-26T00:20:37.870158" elapsed="0.001503"/>
</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-04-26T00:20:37.871988" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.871821" elapsed="0.000227"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.871713" elapsed="0.000361"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.868153" elapsed="0.003972"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:20:37.872165" elapsed="0.000047"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-26T00:20:37.856940" elapsed="0.015386"/>
</kw>
<kw name="Clean_Journals_Data_And_Snapshots_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.875253" 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-04-26T00:20:37.874876" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.875734" 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-04-26T00:20:37.875451" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.875803" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.875952" 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-04-26T00:20:37.874510" elapsed="0.001466"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.876525" level="INFO">${command} = rm -rf "/tmp/karaf-0.23.2-SNAPSHOT/"*journal "/tmp/karaf-0.23.2-SNAPSHOT/snapshots" "/tmp/karaf-0.23.2-SNAPSHOT/data"</msg>
<var>${command}</var>
<arg>rm -rf "${karaf_home}/"*journal "${karaf_home}/snapshots" "${karaf_home}/data"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.876150" elapsed="0.000401"/>
</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-04-26T00:20:37.876873" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.876709" elapsed="0.000222"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.876601" elapsed="0.000355"/>
</for>
<doc>Delete journal and snapshots directories on every node listed (or all).
BEWARE: If only a subset of members is cleaned, this causes RetiredGenerationException in Carbon after the affected node re-start.
See https://bugs.opendaylight.org/show_bug.cgi?id=8138</doc>
<status status="PASS" start="2026-04-26T00:20:37.872549" elapsed="0.004458"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.888107" level="INFO">${base_command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.887734" elapsed="0.000400"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.888702" level="INFO">${command} = /tmp/karaf-0.23.2-SNAPSHOT/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.888339" elapsed="0.000427"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:20:37.889192" level="INFO">${epoch} = 1777162837.889121</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-26T00:20:37.888929" elapsed="0.000289"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.889794" level="INFO">${gc_filepath} = /tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.889121.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.889395" elapsed="0.000426"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.890373" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.2-SNAPSHOT/data/log/gc_1777162837.889121.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:20:37.889982" elapsed="0.000418"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.891859" 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-04-26T00:20:37.891490" elapsed="0.000395"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.892345" 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-04-26T00:20:37.892037" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.892416" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.892564" 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-04-26T00:20:37.891114" elapsed="0.001474"/>
</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-04-26T00:20:37.892905" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.892743" elapsed="0.000219"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.892638" elapsed="0.000350"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.890613" elapsed="0.002426"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.903034" 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-04-26T00:20:37.902662" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.903515" 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-04-26T00:20:37.903210" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.903584" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:20:37.903734" 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-04-26T00:20:37.902299" elapsed="0.001459"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.904175" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.904352" elapsed="0.000017"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:20:37.904311" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.904289" elapsed="0.000127"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.904549" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.903962" elapsed="0.000640"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.903808" elapsed="0.000819"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-26T00:20:37.901908" elapsed="0.002770"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.901617" elapsed="0.003090"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.901598" elapsed="0.003131"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.906313" 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-04-26T00:20:37.905765" elapsed="0.000575"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.906779" 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-04-26T00:20:37.906494" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.906888" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:20:37.907042" 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-04-26T00:20:37.905406" elapsed="0.001660"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.907405" elapsed="0.000024"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.910836" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.907233" elapsed="0.003669"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.907117" elapsed="0.003812"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:20:37.905030" elapsed="0.005951"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.904782" elapsed="0.006227"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.904767" elapsed="0.006266"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.911418" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.911088" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.911071" elapsed="0.000428"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-26T00:20:37.901197" elapsed="0.010347"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:20:37.893190" elapsed="0.018412"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.914632" 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-04-26T00:20:37.914243" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.915091" 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-04-26T00:20:37.914810" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.915159" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.915325" 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-04-26T00:20:37.913853" elapsed="0.001497"/>
</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-04-26T00:20:37.915671" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.915508" elapsed="0.000221"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.915400" elapsed="0.000355"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:20:37.911852" elapsed="0.003954"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-26T00:20:37.880963" elapsed="0.034889"/>
</kw>
<doc>Clear data after stoping all members and then restart all members.</doc>
<status status="PASS" start="2026-04-26T00:20:37.856519" elapsed="0.059380"/>
</kw>
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-26T00:20:37.918251" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-26T00:20:37.918002" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.919486" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.919380" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.919361" elapsed="0.000191"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.923818" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.923714" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.923697" elapsed="0.000187"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.924859" 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-04-26T00:20:37.924483" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.925382" 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-04-26T00:20:37.925075" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:20:37.925453" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:20:37.925603" 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-04-26T00:20:37.924094" elapsed="0.001534"/>
</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-04-26T00:20:37.925956" 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-04-26T00:20:37.926189" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.926052" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.926034" elapsed="0.000228"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.925824" elapsed="0.000481"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.925677" elapsed="0.000652"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:20:37.923364" elapsed="0.003018"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-26T00:20:37.919079" elapsed="0.007356"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:20:37.918669" elapsed="0.007809"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-26T00:20:37.916082" elapsed="0.010447"/>
</kw>
<doc>Clear data and set loging.</doc>
<status status="PASS" start="2026-04-26T00:20:37.856256" elapsed="0.070319"/>
</kw>
<kw name="Setup_Netty_Replication" owner="NettyReplication">
<kw name="Open_Source_Connection" owner="NettyReplication">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.928383" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.928253" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.928232" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-26T00:20:37.928814" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.928586" elapsed="0.000339">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.929093" elapsed="0.000021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.929265" elapsed="0.000035"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.929456" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.929681" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.929545" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.929528" elapsed="0.000227"/>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.929889" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.930101" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.929968" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:20:37.929953" elapsed="0.000222"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.930206" elapsed="0.000014"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<msg time="2026-04-26T00:20:37.934495" level="FAIL">Variable '${current_connection_index}' not found.</msg>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.930968" elapsed="0.003560">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.930468" elapsed="0.004124">Variable '${current_connection_index}' not found.</status>
</kw>
<arg>config:edit org.opendaylight.mdsal.replicate.netty.source</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.927923" elapsed="0.006753">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:property-set enabled true</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.935055" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>config:update</arg>
<arg>member_index=${source_member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.935418" elapsed="0.000025"/>
</kw>
<arg>${source_member_index}</arg>
<doc>Open source part of netty replicate connection on specific node.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.927179" elapsed="0.008358">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<for flavor="IN">
<iter>
<kw name="Open_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<arg>source_member_index=${source_member_index}</arg>
<doc>Open sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.935807" elapsed="0.000022"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.935643" elapsed="0.000222"/>
</iter>
<var>${sink_member_index}</var>
<value>@{sink_members_indexes}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.935592" elapsed="0.000299"/>
</for>
<doc>Set up netty replication connections betwean source and sinks.</doc>
<status status="FAIL" start="2026-04-26T00:20:37.926793" elapsed="0.009182">Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping_older}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.936136" elapsed="0.000021"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>iterations=${5}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.936363" elapsed="0.000023"/>
</kw>
<kw name="Teardown_Netty_Replication" owner="NettyReplication">
<doc>Tear down netty replication connections betwean source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.936598" elapsed="0.000023"/>
</kw>
<kw name="Setup_Netty_Replication" owner="NettyReplication">
<arg>source_memeber_index=${ADDITIONAL_SOURCE_NODE_INDEX}</arg>
<arg>sink_members_indexes=${DEFAULT_NETTY_SINK_NODE_INDEXES}</arg>
<doc>Set up netty replication connections betwean source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.936821" elapsed="0.000022"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<var>&amp;{mapping_newer}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.936997" elapsed="0.000020"/>
</kw>
<kw name="Put_Config_And_Verify">
<arg>${CARPEOPLE_DEV_FOLDER}/cars</arg>
<arg>source_node_index=${ADDITIONAL_SOURCE_NODE_INDEX}</arg>
<arg>iterations=${8}</arg>
<doc>Request put config on netty replicate source and verify changes has been made on both source and sinks.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.937171" elapsed="0.000021"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${netty_sink_session_alias}</var>
<arg>member_index=@{DEFAULT_NETTY_SINK_NODE_INDEXES}[0]</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.937382" elapsed="0.000023"/>
</kw>
<kw name="Verify_Config_Is_Not_Present">
<arg>${CARPEOPLE_DEV_FOLDER}/people</arg>
<arg>session=${netty_sink_session_alias}</arg>
<arg>removal=True</arg>
<doc>Verify config is not present on the target node datastore by using templated request. Should get return code 404 or 409.
removal - Retries until config is not present (for cases of cofig deletion when config migh be present at begining, but disapears later)
wait_time - Repeatedly checks for specific amount of time if config does not appear (for cases of config addition when config is not present, but might appear after some time)</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.937596" elapsed="0.000021"/>
</kw>
<kw name="Teardown_Test" type="TEARDOWN">
<for flavor="IN">
<iter>
<kw name="Close_Source_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close source part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.938370" elapsed="0.000024"/>
</kw>
<kw name="Close_Sink_Connection" owner="NettyReplication">
<arg>${sink_member_index}</arg>
<doc>Close sink part of netty replicate connection on specific node.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.938586" elapsed="0.000022"/>
</kw>
<var name="${sink_member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:20:37.938180" elapsed="0.000460"/>
</iter>
<var>${sink_member_index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:20:37.938059" elapsed="0.000607"/>
</for>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="NOT RUN" start="2026-04-26T00:20:37.939954" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:20:37.939592" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.939573" elapsed="0.000465"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:20:37.940182" elapsed="0.000343"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.945537" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.945030" elapsed="0.000534"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-26T00:20:37.945776" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:20:37.945637" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-26T00:20:37.945619" elapsed="0.000218"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.946285" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:20:37.945977" elapsed="0.000335"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-26T00:20:37.946725" level="INFO">${reference} = mdsal_netty_replicate_txt_Change_Replication_Source</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-26T00:20:37.946466" elapsed="0.000317"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-26T00:20:37.947115" level="INFO">${reference} = mdsal_netty_replicate_txt_change_replication_source</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.946940" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.947650" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_change_replication_source"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.947307" elapsed="0.000369"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.948131" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_change_replication_source&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-26T00:20:37.947825" elapsed="0.000333"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.948789" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_change_replication_source"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_change_replication_source&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-26T00:20:37.948334" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-26T00:20:37.949295" level="INFO">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_change_replication_source"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_change_replication_source&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-26T00:20:37.948988" elapsed="0.000356"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-26T00:20:37.944734" elapsed="0.004664"/>
</kw>
<status status="PASS" start="2026-04-26T00:20:37.939381" elapsed="0.010066"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.938840" elapsed="0.010647"/>
</kw>
<doc>Close all netty replication connections and show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-26T00:20:37.937867" elapsed="0.011663"/>
</kw>
<doc>After changing replication source ODL to another ODL, sink should reflect datastore from newer source, forgeting changes from the old datastore.</doc>
<tag>3node</tag>
<tag>critical</tag>
<tag>netty-replicate</tag>
<status status="FAIL" start="2026-04-26T00:20:37.855663" elapsed="0.093904">... click for list of related bugs or create a new one if needed (with the
"mdsal_netty_replicate_txt_change_replication_source"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=mdsal_netty_replicate_txt_change_replication_source&amp;order=bug_status"

Dictionary does not contain key '1'.

Also keyword teardown failed:
Variable '${current_connection_index}' not found.</status>
</test>
<doc>Test suite for testing MD-SAL netty replication functionality</doc>
<status status="FAIL" start="2026-04-26T00:20:36.585144" elapsed="1.364892"/>
</suite>
<statistics>
<total>
<stat pass="0" fail="8" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="0" fail="8" skip="0">3node</stat>
<stat pass="0" fail="8" skip="0">critical</stat>
<stat pass="0" fail="8" skip="0">netty-replicate</stat>
</tag>
<suite>
<stat name="mdsal-netty-replicate.txt" id="s1" pass="0" fail="8" skip="0">mdsal-netty-replicate.txt</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
