<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-26T00:21:18.485155" rpa="false" schemaversion="5">
<suite id="s1" name="netconf-clustering.txt">
<suite id="s1-s1" name="CRUD" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/CRUD.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.131629" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:21:19.127372" elapsed="0.004324"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-26T00:21:19.126877" elapsed="0.004908"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.136873" 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:21:19.133213" elapsed="0.003692"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-26T00:21:19.137158" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.137033" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.137000" elapsed="0.000234"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.137800" 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:21:19.137405" elapsed="0.000442"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.138368" 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:21:19.138037" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-26T00:21:19.138979" elapsed="0.000302"/>
</kw>
<msg time="2026-04-26T00:21:19.139417" level="INFO">${status} = PASS</msg>
<msg time="2026-04-26T00:21:19.139472" 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:21:19.138573" elapsed="0.000923"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.140075" 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:21:19.139668" elapsed="0.000435"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.141702" 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:21:19.141418" elapsed="0.000313"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.142160" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:19.141882" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.142811" 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:21:19.142344" elapsed="0.000495"/>
</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:21:19.145338" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.145145" elapsed="0.000267"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.142899" elapsed="0.002543"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.146040" 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:21:19.145609" elapsed="0.000477"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.146657" 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:21:19.146251" elapsed="0.000449"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.147283" 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:21:19.146861" elapsed="0.000466"/>
</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:21:19.140946" elapsed="0.006471"/>
</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:21:19.132825" elapsed="0.014651"/>
</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:21:19.147663" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.147546" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.147525" elapsed="0.000207"/>
</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:21:19.150805" 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:21:19.150420" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.151371" 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:21:19.151062" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.151445" elapsed="0.000041"/>
</return>
<msg time="2026-04-26T00:21:19.151618" 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:21:19.150080" elapsed="0.001564"/>
</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:21:19.152008" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.151814" elapsed="0.000256"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.151698" elapsed="0.000399"/>
</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:21:19.147978" elapsed="0.004175"/>
</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:21:19.152302" 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:21:19.152826" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.152690" elapsed="0.000201"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.152565" elapsed="0.000369"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-26T00:21:19.132196" elapsed="0.020801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.155593" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.155479" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.155454" elapsed="0.000209"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.160336" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.160226" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.160207" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.161407" 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:21:19.160977" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.161881" 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:21:19.161594" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.161968" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:21:19.162126" 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:21:19.160634" elapsed="0.001517"/>
</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:21:19.162517" 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:21:19.162762" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.162617" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:19.162599" elapsed="0.000239"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.162374" elapsed="0.000488"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.162204" elapsed="0.000684"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:21:19.159933" elapsed="0.003027"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-26T00:21:19.153567" elapsed="0.009449"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:21:19.153150" elapsed="0.009908"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-26T00:21:19.126515" elapsed="0.036592"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.163955" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:21:19.163673" elapsed="0.000309"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.168025" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:21:19.164139" elapsed="0.003967"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.171540" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.168180" elapsed="0.003424"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.168161" elapsed="0.003469"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.176766" level="INFO">${odl_connection} = 1</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-26T00:21:19.176342" elapsed="0.000451"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.178551" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:21:19.178632" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:21:19.178162" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:19.178815" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.180052" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-26T00:21:19.180625" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.179712" elapsed="0.003511">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:21:19.183290" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.179325" elapsed="0.004020"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.177713" elapsed="0.005777">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:21:19.183538" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.177314" elapsed="0.006272"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.176988" elapsed="0.006692">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.183731" elapsed="0.000019"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.175977" elapsed="0.007853">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.184013" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.184177" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-26T00:21:19.184300" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.184259" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:19.184241" elapsed="0.000120"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.188531" elapsed="0.000027"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.171881" elapsed="0.016770">OSError: [Errno 16] Device or resource busy</status>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.163353" elapsed="0.025386">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node1</arg>
<arg>http://${ODL_SYSTEM_1_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.188984" elapsed="0.000023"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node2</arg>
<arg>http://${ODL_SYSTEM_2_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.189161" elapsed="0.000020"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node3</arg>
<arg>http://${ODL_SYSTEM_3_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.189331" elapsed="0.000019"/>
</kw>
<doc>Initialize SetupUtils, setup everything needed for the test cases.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.126092" elapsed="0.063347">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s1-t1" name="Start_Testtool" line="68">
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.189510" elapsed="0.000455">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" line="74">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.190163" elapsed="0.000429">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t3" name="Configure_Device_On_Netconf" line="79">
<doc>Make request to configure a testtool device on Netconf connector</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.190805" elapsed="0.000419">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t4" name="Check_Configurer_Has_Netconf_Connector_For_Device" line="88">
<doc>Get the list of mounts and search for our device there. Fail if not found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.191414" elapsed="0.000457">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t5" name="Wait_For_Device_To_Become_Visible_For_Configurer" line="98">
<doc>Wait until the device becomes visible on configurer node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.192062" elapsed="0.000399">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t6" name="Wait_For_Device_To_Become_Visible_For_Checker" line="102">
<doc>Wait until the device becomes visible on checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.192628" elapsed="0.000408">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t7" name="Wait_For_Device_To_Become_Visible_For_Setter" line="106">
<doc>Wait until the device becomes visible on setter node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.193208" elapsed="0.000381">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t8" name="Check_Device_Data_Is_Seen_As_Empty_On_Configurer" line="110">
<doc>Get the device data as seen by configurer and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.193763" elapsed="0.000432">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t9" name="Check_Device_Data_Is_Seen_As_Empty_On_Checker" line="119">
<doc>Get the device data as seen by checker and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.194368" elapsed="0.000389">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t10" name="Check_Device_Data_Is_Seen_As_Empty_On_Setter" line="128">
<doc>Get the device data as seen by setter and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.194936" elapsed="0.000389">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t11" name="Create_Device_Data" line="137">
<doc>Send some sample test data into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.195517" elapsed="0.000354">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t12" name="Check_New_Device_Data_Is_Visible_On_Setter" line="147">
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.196090" elapsed="0.000383">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t13" name="Check_New_Device_Data_Is_Visible_On_Checker" line="156">
<doc>Check that the created device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.196632" elapsed="0.000415">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t14" name="Check_New_Device_Data_Is_Visible_On_Configurer" line="165">
<doc>Check that the created device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.197206" elapsed="0.000409">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t15" name="Modify_Device_Data" line="174">
<doc>Send a request to change the sample test data and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.197778" elapsed="0.000372">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t16" name="Check_Device_Data_Is_Modified" line="185">
<doc>Get the device data and make sure it contains the modified content.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.198307" elapsed="0.000354">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t17" name="Check_Modified_Device_Data_Is_Visible_On_Checker" line="190">
<doc>Check that the modified device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.198817" elapsed="0.000419">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t18" name="Check_Modified_Device_Data_Is_Visible_On_Configurer" line="195">
<doc>Check that the modified device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.199407" elapsed="0.000415">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t19" name="Delete_Device_Data" line="200">
<doc>Send a request to delete the sample test data on the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.200002" elapsed="0.000379">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t20" name="Check_Device_Data_Is_Deleted" line="211">
<doc>Get the device data and make sure it is empty again.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.200538" elapsed="0.000329">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t21" name="Check_Device_Data_Deletion_Is_Visible_On_Checker" line="216">
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.201042" elapsed="0.000401">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t22" name="Check_Device_Data_Deletion_Is_Visible_On_Configurer" line="221">
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.201600" elapsed="0.000425">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t23" name="Deconfigure_Device_In_Netconf" line="226">
<doc>Make request to deconfigure the device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.202184" elapsed="0.000362">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t24" name="Check_Device_Deconfigured_On_Configurer" line="232">
<doc>Check that the device is really going to be gone. Fail if still there after one minute.
This is an expected behavior as the unmount request is sent to the config subsystem which
then triggers asynchronous disconnection of the device which is reflected in the operational
data once completed. This test makes sure this asynchronous operation does not take
unreasonable amount of time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.202711" elapsed="0.000918">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t25" name="Check_Device_Deconfigured_On_Checker" line="241">
<doc>Check that the device is going to be gone from the checker node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.203796" elapsed="0.000457">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t26" name="Check_Device_Deconfigured_On_Setter" line="246">
<doc>Check that the device is going to be gone from the setter node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.204418" elapsed="0.000431">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-26T00:21:19.205740" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-26T00:21:19.205661" elapsed="0.000132"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.207071" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:21:19.206722" elapsed="0.000376"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.207466" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.207249" elapsed="0.000717">Cannot open session, you need to establish a connection first.</status>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.206275" elapsed="0.001812">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.208410" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.208244" elapsed="0.000747">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.213159" level="FAIL">Variable '${testtool_log}' not found.</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.209158" elapsed="0.004036">Variable '${testtool_log}' not found.</status>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.206012" elapsed="0.007310">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.205434" elapsed="0.007996">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>netconf clustered CRUD test suite.

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

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


Perform basic operations (Create, Read, Update and Delete or CRUD) on device
data mounted onto a netconf connector and see if they work.

The suite recognizes 3 nodes, "CONFIGURER" (the node that configures the
device at the beginning and then deconfigures it at the end), "SETTER" (the
node that manipulates the data on the device) and "CHECKER" (the node that
checks the data on the device). The configured device and the results of each
data operation on it is expected to be visible on all nodes so after each
operation three test cases make sure they can see the result on their
respective nodes.

The 3 nodes are configured by placing "node1", "node2" or "node3" into the
node1, node2 and node3 to make the node
a "CONFIGURER", "SETTER" and "CHECKER" respectively. The "nodeX" name refers
to the node with its IP address configured with the ${ODL_SYSTEM_X_IP}
variable where the "X" is 1, 2 or 3.

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-04-26T00:21:18.524692" elapsed="0.688830">Suite setup failed:
OSError: [Errno 16] Device or resource busy

Also suite teardown failed:
Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</suite>
<suite id="s1-s2" name="Bug8086" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/bug8086.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.300763" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:21:19.296228" elapsed="0.004612"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-26T00:21:19.295999" elapsed="0.004953"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.306130" 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:21:19.302320" elapsed="0.003839"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-26T00:21:19.306395" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.306257" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.306227" elapsed="0.000240"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.307008" 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:21:19.306626" elapsed="0.000428"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.307568" 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:21:19.307218" elapsed="0.000378"/>
</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:21:19.308134" elapsed="0.000290"/>
</kw>
<msg time="2026-04-26T00:21:19.308529" level="INFO">${status} = PASS</msg>
<msg time="2026-04-26T00:21:19.308576" 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:21:19.307763" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.309232" 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:21:19.308767" elapsed="0.000494"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.310264" 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:21:19.309991" elapsed="0.000301"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.310704" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:19.310442" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.311207" 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:21:19.310887" elapsed="0.000347"/>
</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:21:19.313816" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.313629" elapsed="0.000262"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.311329" elapsed="0.002608"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.314510" 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:21:19.314101" elapsed="0.000454"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.315140" 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:21:19.314721" elapsed="0.000463"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.315755" 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:21:19.315347" elapsed="0.000453"/>
</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:21:19.309519" elapsed="0.006341"/>
</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:21:19.301858" elapsed="0.014074"/>
</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:21:19.316120" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.316004" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.315985" elapsed="0.000204"/>
</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:21:19.319388" 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:21:19.319002" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.319933" 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:21:19.319619" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.320010" elapsed="0.000037"/>
</return>
<msg time="2026-04-26T00:21:19.320177" 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:21:19.318660" elapsed="0.001543"/>
</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:21:19.320548" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.320373" elapsed="0.000234"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.320257" elapsed="0.000376"/>
</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:21:19.316409" elapsed="0.004277"/>
</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:21:19.320837" elapsed="0.000231"/>
</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:21:19.321383" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.321245" elapsed="0.000203"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.321122" elapsed="0.000352"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-26T00:21:19.301343" elapsed="0.020186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.324128" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.324017" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.323998" elapsed="0.000245"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.328912" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.328806" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.328788" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.329947" 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:21:19.329545" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.330424" 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:21:19.330134" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.330495" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:21:19.330649" 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:21:19.329216" elapsed="0.001458"/>
</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:21:19.331052" 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:21:19.331297" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.331152" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:19.331135" elapsed="0.000240"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.330890" elapsed="0.000508"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.330731" elapsed="0.000693"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:21:19.328512" elapsed="0.003051"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-26T00:21:19.322117" elapsed="0.009511"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:21:19.321678" elapsed="0.009992"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-26T00:21:19.295672" elapsed="0.036047"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.332535" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:21:19.332271" elapsed="0.000290"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.336529" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:21:19.332718" elapsed="0.003857"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.340073" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.336646" elapsed="0.003490"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.336628" elapsed="0.003533"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.345244" level="INFO">${odl_connection} = 1</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-26T00:21:19.344811" elapsed="0.000460"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.346880" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:21:19.346987" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:21:19.346599" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:19.347168" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.348376" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-26T00:21:19.348684" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.348053" elapsed="0.001110">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:21:19.349221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.347681" elapsed="0.001590"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.346176" elapsed="0.003239">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:21:19.349465" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.345774" elapsed="0.003739"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.345448" elapsed="0.004158">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.349655" elapsed="0.000016"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.344444" elapsed="0.005306">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.349913" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.350101" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-26T00:21:19.350222" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.350183" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:19.350165" elapsed="0.000114"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.354370" elapsed="0.000027"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.340407" elapsed="0.014077">OSError: [Errno 16] Device or resource busy</status>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.331987" elapsed="0.022582">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node1</arg>
<arg>http://${ODL_SYSTEM_1_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.354731" elapsed="0.000022"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node2</arg>
<arg>http://${ODL_SYSTEM_2_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.354905" elapsed="0.000035"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node3</arg>
<arg>http://${ODL_SYSTEM_3_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.355092" elapsed="0.000020"/>
</kw>
<kw name="List_All_Indices" owner="ClusterManagement">
<var>${index_list}</var>
<doc>Create a new list of all indices.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.355305" elapsed="0.000023"/>
</kw>
<kw name="Safe_With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<arg>${index_list}</arg>
<arg>Populate_Schema_Directory_Over_Active_Connection</arg>
<doc>Remember active ssh connection index, call With_Ssh_To_List_Or_All_Run_Keyword, return None. Restore the conection index on teardown.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.355538" elapsed="0.000024"/>
</kw>
<doc>Initialize resources, sreate sessions, on each ODL machine create a directory and copy the car model there.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.295325" elapsed="0.060327">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s2-t1" name="Start_Testtool" line="64">
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.355720" elapsed="0.000415">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" line="70">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.356309" elapsed="0.000403">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t3" name="Configure_Device_On_Netconf" line="75">
<doc>Make request to configure a testtool device on Netconf connector</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.356883" elapsed="0.000393">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t4" name="Check_Configurer_Has_Netconf_Connector_For_Device" line="84">
<doc>Get the list of mounts and search for our device there. Fail if not found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.357444" elapsed="0.000428">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t5" name="Wait_For_Device_To_Become_Visible_For_Configurer" line="94">
<doc>Wait until the device becomes visible on configurer node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.358053" elapsed="0.000386">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t6" name="Wait_For_Device_To_Become_Visible_For_Checker" line="98">
<doc>Wait until the device becomes visible on checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.358598" elapsed="0.000397">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t7" name="Wait_For_Device_To_Become_Visible_For_Setter" line="102">
<doc>Wait until the device becomes visible on setter node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.359155" elapsed="0.000391">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t8" name="Check_Device_Data_Is_Seen_As_Empty_On_Configurer" line="106">
<doc>Get the device data as seen by configurer and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.359710" elapsed="0.000416">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t9" name="Check_Device_Data_Is_Seen_As_Empty_On_Checker" line="115">
<doc>Get the device data as seen by checker and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.360285" elapsed="0.000389">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t10" name="Check_Device_Data_Is_Seen_As_Empty_On_Setter" line="124">
<doc>Get the device data as seen by setter and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.360837" elapsed="0.000403">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t11" name="Create_Device_Data" line="133">
<doc>Send some sample test data into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.361435" elapsed="0.000394">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t12" name="Check_New_Device_Data_Is_Visible_On_Setter" line="143">
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.362010" elapsed="0.000398">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t13" name="Check_New_Device_Data_Is_Visible_On_Checker" line="152">
<doc>Check that the created device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.362567" elapsed="0.000415">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t14" name="Check_New_Device_Data_Is_Visible_On_Configurer" line="161">
<doc>Check that the created device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.363145" elapsed="0.000436">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t15" name="Modify_Device_Data" line="170">
<doc>Send a request to change the sample test data and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.363744" elapsed="0.000384">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t16" name="Check_Device_Data_Is_Modified" line="180">
<doc>Get the device data and make sure it contains the modified content.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.364289" elapsed="0.000359">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t17" name="Check_Modified_Device_Data_Is_Visible_On_Checker" line="184">
<doc>Check that the modified device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.364809" elapsed="0.000424">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t18" name="Check_Modified_Device_Data_Is_Visible_On_Configurer" line="188">
<doc>Check that the modified device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.365393" elapsed="0.000421">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t19" name="Delete_Device_Data" line="192">
<doc>Send a request to delete the sample test data on the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.365989" elapsed="0.000384">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t20" name="Check_Device_Data_Is_Deleted" line="202">
<doc>Get the device data and make sure it is empty again.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.366534" elapsed="0.000336">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t21" name="Check_Device_Data_Deletion_Is_Visible_On_Checker" line="206">
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.367046" elapsed="0.000413">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t22" name="Check_Device_Data_Deletion_Is_Visible_On_Configurer" line="210">
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.367630" elapsed="0.000434">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t23" name="Deconfigure_Device_In_Netconf" line="214">
<doc>Make request to deconfigure the device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.368224" elapsed="0.000367">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t24" name="Check_Device_Deconfigured_On_Configurer" line="220">
<doc>Check that the device is really going to be gone. Fail if still there after one minute.
This is an expected behavior as the unmount request is sent to the config subsystem which
then triggers asynchronous disconnection of the device which is reflected in the operational
data once completed. This test makes sure this asynchronous operation does not take
unreasonable amount of time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.368757" elapsed="0.000920">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t25" name="Check_Device_Deconfigured_On_Checker" line="229">
<doc>Check that the device is going to be gone from the checker node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.369846" elapsed="0.000462">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s2-t26" name="Check_Device_Deconfigured_On_Setter" line="234">
<doc>Check that the device is going to be gone from the setter node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.370473" elapsed="0.000438">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-26T00:21:19.371679" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-26T00:21:19.371604" elapsed="0.000124"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.373003" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:21:19.372416" elapsed="0.000616"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.373373" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.373183" elapsed="0.000629">Cannot open session, you need to establish a connection first.</status>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.372200" elapsed="0.001746">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.374269" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.374109" elapsed="0.000718">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.378936" level="FAIL">Variable '${testtool_log}' not found.</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.375008" elapsed="0.003962">Variable '${testtool_log}' not found.</status>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.371941" elapsed="0.007150">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.371359" elapsed="0.007837">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>Simplified netconf clustered CRUD test suite in Bug 8086 setup.

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

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


Perform basic operations (Create, Read, Update and Delete or CRUD) on device
data mounted onto a netconf connector and see if they work.

The suite recognizes 3 nodes, "CONFIGURER" (the node that configures the
device at the beginning and then deconfigures it at the end), "SETTER" (the
node that manipulates the data on the device) and "CHECKER" (the node that
checks the data on the device). The configured device and the results of each
data operation on it is expected to be visible on all nodes so after each
operation three test cases make sure they can see the result on their
respective nodes.

The 3 nodes are configured by placing "node1", "node2" or "node3" into the
node1, node2 and node3 to make the node
a "CONFIGURER", "SETTER" and "CHECKER" respectively. The "nodeX" name refers
to the node with its IP address configured with the ${ODL_SYSTEM_X_IP}
variable where the "X" is 1, 2 or 3.

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.214206" elapsed="0.165104">Suite setup failed:
OSError: [Errno 16] Device or resource busy

Also suite teardown failed:
Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</suite>
<suite id="s1-s3" name="Restart Odl With Tell Based False" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/controller/dom_data_broker/restart_odl_with_tell_based_false.robot">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils" type="SETUP">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.543501" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:21:19.539136" elapsed="0.004420"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-26T00:21:19.538879" elapsed="0.004759"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.548883" 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:21:19.544739" elapsed="0.004172"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-26T00:21:19.549120" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.549011" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.548987" elapsed="0.000202"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.549687" 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:21:19.549348" elapsed="0.000382"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.550234" 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:21:19.549897" elapsed="0.000364"/>
</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:21:19.550781" elapsed="0.000306"/>
</kw>
<msg time="2026-04-26T00:21:19.551190" level="INFO">${status} = PASS</msg>
<msg time="2026-04-26T00:21:19.551235" 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:21:19.550429" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.551823" 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:21:19.551428" elapsed="0.000422"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.553013" 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:21:19.552731" elapsed="0.000309"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.553444" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:19.553191" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.553929" 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:21:19.553628" elapsed="0.000330"/>
</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:21:19.556704" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.556516" elapsed="0.000261"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.554013" elapsed="0.002792"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.557371" 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:21:19.556985" elapsed="0.000430"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.557973" 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:21:19.557579" elapsed="0.000488"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.558607" 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:21:19.558235" elapsed="0.000416"/>
</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:21:19.552285" elapsed="0.006423"/>
</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:21:19.544397" elapsed="0.014368"/>
</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:21:19.558962" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.558831" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.558812" elapsed="0.000219"/>
</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:21:19.562225" 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:21:19.561829" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.562692" 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:21:19.562411" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.562762" elapsed="0.000036"/>
</return>
<msg time="2026-04-26T00:21:19.562936" 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:21:19.561464" elapsed="0.001498"/>
</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:21:19.563294" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.563122" elapsed="0.000230"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.563014" elapsed="0.000363"/>
</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:21:19.559251" elapsed="0.004178"/>
</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:21:19.563604" elapsed="0.000214"/>
</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:21:19.564139" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.564000" elapsed="0.000202"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.563868" elapsed="0.000359"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-26T00:21:19.543946" elapsed="0.020332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.566911" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.566803" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.566786" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.571904" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.571799" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.571781" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.572900" 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:21:19.572526" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.573390" 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:21:19.573108" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.573461" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:21:19.573610" 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:21:19.572206" elapsed="0.001428"/>
</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:21:19.573986" 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:21:19.574266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.574082" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:19.574065" elapsed="0.000279"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.573827" elapsed="0.000541"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.573684" elapsed="0.000708"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:21:19.571490" elapsed="0.002955"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-26T00:21:19.564841" elapsed="0.009658"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:21:19.564430" elapsed="0.010111"/>
</kw>
<arg>http_timeout=125</arg>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-26T00:21:19.538506" elapsed="0.036083"/>
</kw>
<test id="s1-s3-t1" name="Stop_All_Members" line="30">
<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:21:19.580337" 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:21:19.579960" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.580809" 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:21:19.580525" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.580879" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:19.581049" 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:21:19.579532" elapsed="0.001541"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.582034" 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:21:19.581648" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.582503" 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:21:19.582221" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.582572" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:19.582722" 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:21:19.581278" elapsed="0.001468"/>
</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:21:19.584221" 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:21:19.583831" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.584693" 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:21:19.584410" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.584765" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:21:19.584930" 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:21:19.583442" 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:21:19.585288" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.585115" elapsed="0.000234"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.585006" elapsed="0.000369"/>
</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:21:19.582960" elapsed="0.002469"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.585873" 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:21:19.585584" elapsed="0.000314"/>
</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:21:19.586166" elapsed="0.000223"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.586565" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:21:19.586461" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.586443" 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:21:19.586931" elapsed="0.000059"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.586776" elapsed="0.000258"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.586667" elapsed="0.000394"/>
</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:21:19.590425" 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:21:19.590047" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.590903" 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:21:19.590615" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.590990" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:21:19.591146" 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:21:19.589656" 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:21:19.591503" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.591330" elapsed="0.000232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.591222" 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:21:19.587261" elapsed="0.004393"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:21:19.591696" elapsed="0.000030"/>
</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:21:19.575231" elapsed="0.016590"/>
</kw>
<doc>Stop every odl node.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-26T00:21:19.574647" elapsed="0.017290"/>
</test>
<test id="s1-s3-t2" name="Unset_Tell_Based_Protocol_Usage" line="34">
<kw name="Change_Use_Tell_Based_Protocol" owner="DdbCommons">
<kw name="Check_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:21:19.596227" 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:21:19.595832" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.596699" 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:21:19.596416" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.596769" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:21:19.596945" 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:21:19.595435" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.597291" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.597134" elapsed="0.000226"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.597022" elapsed="0.000364"/>
</for>
<arg>sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:21:19.593080" elapsed="0.004362"/>
</kw>
<kw name="Check_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:21:19.600791" 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:21:19.600419" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.601274" 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:21:19.600992" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.601343" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:21:19.601492" 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:21:19.600049" elapsed="0.001467"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.601817" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.601670" elapsed="0.000263"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.601565" elapsed="0.000397"/>
</for>
<arg>sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:21:19.597665" elapsed="0.004351"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"${status}" == "True"</arg>
<arg>ClusterManagement.Check_Bash_Command_On_List_Or_All</arg>
<arg>sed -ie "s/^use-tell-based-protocol=false/use-tell-based-protocol=true/g" ${DATASTORE_CFG}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:19.602173" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Check_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:21:19.606448" 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:21:19.606077" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.606932" 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:21:19.606635" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.607003" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:19.607154" 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:21:19.605691" elapsed="0.001487"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.607483" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.607334" elapsed="0.000217"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.607227" elapsed="0.000349"/>
</for>
<arg>sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:21:19.603143" elapsed="0.004500"/>
</kw>
<msg time="2026-04-26T00:21:19.607685" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"${status}" == "False"</arg>
<arg>ClusterManagement.Check_Bash_Command_On_List_Or_All</arg>
<arg>sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:19.602653" elapsed="0.005082"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>Failure in status. Status can be True or False.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.607893" elapsed="0.000021"/>
</kw>
<arg>False</arg>
<arg>${DATASTORE_CFG}</arg>
<doc>Change status use-tell-based-protocol to True or False</doc>
<status status="PASS" start="2026-04-26T00:21:19.592656" elapsed="0.015337"/>
</kw>
<kw name="Check_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:21:19.611289" 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:21:19.610901" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.611821" 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:21:19.611476" elapsed="0.000372"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.611893" elapsed="0.000040"/>
</return>
<msg time="2026-04-26T00:21:19.612059" 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:21:19.610533" elapsed="0.001551"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.612398" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.612241" elapsed="0.000226"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.612134" elapsed="0.000359"/>
</for>
<arg>cat ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:21:19.608213" elapsed="0.004332"/>
</kw>
<kw name="Clean_Directories_On_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.622762" level="INFO">${path_list} = ['tmp/', 'data/', 'cache/', 'snapshots/', 'journal/', 'segmented-journal/', 'etc/opendaylight/current/', 'etc/host.key']</msg>
<var>${path_list}</var>
<arg>"${directory_list}" == "${EMPTY}"</arg>
<arg>${ODL_DEFAULT_DATA_PATHS}</arg>
<arg>${directory_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:21:19.620539" elapsed="0.002251"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${tmp_dir}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Check_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:21:19.624548" 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:21:19.624178" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.625042" 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:21:19.624737" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.625112" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:21:19.625264" 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:21:19.623790" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.625595" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.625446" elapsed="0.000218"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.625339" elapsed="0.000350"/>
</for>
<arg>mkdir -p '${tmp_dir}' &amp;&amp; rm -vrf '${tmp_dir}/log' &amp;&amp; mv -vf '${karaf_home}/data/log' '${tmp_dir}/'</arg>
<arg>${member_index_list}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:21:19.623185" elapsed="0.002556"/>
</kw>
<status status="PASS" start="2026-04-26T00:21:19.622867" elapsed="0.002909"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.622848" elapsed="0.002952"/>
</if>
<kw name="Safe_With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-26T00:21:19.627124" level="INFO">index=1
host=
alias=None
port=22
timeout=10 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-26T00:21:19.626967" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>This keyword is experimental and there is high risk of being replaced by another approach.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-26T00:21:19.628371" elapsed="0.000205"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.629538" 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:21:19.629167" elapsed="0.000397"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.630022" 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:21:19.629725" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.630093" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:21:19.630242" 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:21:19.628784" elapsed="0.001483"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.630591" elapsed="0.000024"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.630865" elapsed="0.000024"/>
</kw>
<var name="${member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.630428" elapsed="0.000517"/>
</iter>
<var>${member_index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.630316" elapsed="0.000656"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each index in given list (or all): activate SSH connection, run given Keyword, close active connection. Return None.
Beware that in order to avoid "got positional argument after named arguments", first two arguments in the call should not be named.</doc>
<status status="PASS" start="2026-04-26T00:21:19.627953" elapsed="0.003072"/>
</kw>
<msg time="2026-04-26T00:21:19.631065" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:19.627416" elapsed="0.003696"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-26T00:21:19.635281" elapsed="0.000140"/>
</kw>
<msg time="2026-04-26T00:21:19.635465" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:19.634792" elapsed="0.000734"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.635744" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.635914" elapsed="0.000037"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-26T00:21:19.631407" elapsed="0.004611"/>
</kw>
<arg>With_Ssh_To_List_Or_All_Run_Keyword</arg>
<arg>${member_index_list}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-26T00:21:19.626477" elapsed="0.009598"/>
</kw>
<arg>${member_index_list}</arg>
<arg>ClusterManagement__Clean_Directories</arg>
<arg>${path_list}</arg>
<arg>${karaf_home}</arg>
<doc>Remember active ssh connection index, call With_Ssh_To_List_Or_All_Run_Keyword, return None. Restore the conection index on teardown.</doc>
<status status="PASS" start="2026-04-26T00:21:19.625978" elapsed="0.010158"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${tmp_dir}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Check_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:21:19.637809" 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:21:19.637436" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.638296" 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:21:19.638013" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.638367" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:19.638516" 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:21:19.637069" elapsed="0.001471"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.638844" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.638697" elapsed="0.000216"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.638590" elapsed="0.000364"/>
</for>
<arg>mkdir -p '${karaf_home}/data' &amp;&amp; rm -vrf '${karaf_home}/log' &amp;&amp; mv -vf '${tmp_dir}/log' '${karaf_home}/data/'</arg>
<arg>${member_index_list}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:21:19.636472" elapsed="0.002539"/>
</kw>
<status status="PASS" start="2026-04-26T00:21:19.636207" elapsed="0.002839"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.636189" elapsed="0.002880"/>
</if>
<arg>tmp_dir=/tmp</arg>
<doc>Clear @{directory_list} or ['tmp/', 'data/', 'cache/', 'snapshots/', 'journal/', 'segmented-journal/', 'etc/opendaylight/current/', 'etc/host.key'] for members in given list or all. Return None.
If ${tmp_dir} is nonempty, use that location to preserve data/log/.
This is intended to return Karaf (offline) to the state it was upon the first boot.</doc>
<status status="PASS" start="2026-04-26T00:21:19.616400" elapsed="0.022712"/>
</kw>
<doc>Comment out the flag usage in config file. Also clean most data except data/log/.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-26T00:21:19.592116" elapsed="0.047095"/>
</test>
<test id="s1-s3-t3" name="Start_All_And_Sync" line="40">
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.652244" level="INFO">${base_command} = /tmp/karaf-0.22.3-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:21:19.651850" elapsed="0.000421"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.652798" level="INFO">${command} = /tmp/karaf-0.22.3-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:21:19.652442" elapsed="0.000382"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:21:19.653301" level="INFO">${epoch} = 1777162879.653228</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:21:19.653030" elapsed="0.000298"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.653889" level="INFO">${gc_filepath} = /tmp/karaf-0.22.3-SNAPSHOT/data/log/gc_1777162879.653228.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:21:19.653496" elapsed="0.000434"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.654472" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.22.3-SNAPSHOT/data/log/gc_1777162879.653228.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:21:19.654103" elapsed="0.000396"/>
</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:21:19.655991" 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:21:19.655591" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.656458" 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:21:19.656178" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.656563" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:19.656714" 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:21:19.655228" elapsed="0.001510"/>
</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:21:19.657083" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.656895" elapsed="0.000247"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.656788" elapsed="0.000380"/>
</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:21:19.654707" elapsed="0.002513"/>
</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:21:19.669309" 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:21:19.668910" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.669784" 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:21:19.669498" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.669856" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:21:19.670024" 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:21:19.668539" elapsed="0.001511"/>
</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:21:19.670484" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:21:19.670621" elapsed="0.000020"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:21:19.670578" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:19.670559" elapsed="0.000130"/>
</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:21:19.670831" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.670259" elapsed="0.000625"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.670102" elapsed="0.000808"/>
</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:21:19.668152" elapsed="0.002828"/>
</kw>
<status status="PASS" start="2026-04-26T00:21:19.667831" elapsed="0.003180"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.667812" elapsed="0.003223"/>
</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:21:19.672493" 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:21:19.672120" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.672982" 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:21:19.672681" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.673053" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:19.673205" 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:21:19.671725" elapsed="0.001504"/>
</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:21:19.673558" 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:21:19.677765" elapsed="0.000029"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.673393" elapsed="0.004444"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.673280" elapsed="0.004585"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:21:19.671346" elapsed="0.006590"/>
</kw>
<status status="PASS" start="2026-04-26T00:21:19.671089" elapsed="0.006877"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.671073" elapsed="0.006918"/>
</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:21:19.678383" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.678048" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-26T00:21:19.678031" elapsed="0.000474"/>
</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:21:19.667382" elapsed="0.011172"/>
</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:21:19.657377" elapsed="0.021239"/>
</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:21:19.681989" 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:21:19.681584" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.682472" 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:21:19.682184" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.682544" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:21:19.682695" 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:21:19.681178" elapsed="0.001542"/>
</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:21:19.683067" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.682879" elapsed="0.000247"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.682772" elapsed="0.000380"/>
</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:21:19.678887" elapsed="0.004317"/>
</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:21:19.643992" elapsed="0.039261"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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:21:19.686966" 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:21:19.686577" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.687438" 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:21:19.687155" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.687509" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:19.687677" 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:21:19.686204" elapsed="0.001498"/>
</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:21:19.688052" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.687864" elapsed="0.000248"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.687756" elapsed="0.000381"/>
</for>
<arg>netstat -punta</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:21:19.683982" elapsed="0.004208"/>
</kw>
<arg>60s</arg>
<arg>10s</arg>
<arg>ClusterManagement.Run_Bash_Command_On_List_Or_All</arg>
<arg>netstat -punta</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:21:19.683413" elapsed="0.004822"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.690985" 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:21:19.690596" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.691458" 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:21:19.691174" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.691528" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:19.691706" level="INFO">${index_list} = []</msg>
<var>${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:21:19.688442" elapsed="0.003290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<var>${output}</var>
<arg>command=sudo netstat -punta | grep 2550 | grep LISTEN</arg>
<arg>member_index=${index}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.692130" elapsed="0.000023"/>
</kw>
<kw name="Get Match">
<var>${listening}</var>
<arg>${output}</arg>
<arg>LISTEN</arg>
<doc>Wrapper around String.Get Regexp Matches to return None if not found or the first match if found.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.692388" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${listening}' == 'None'">
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=pid=$(grep org.apache.karaf.main.Main | grep -v grep | tr -s ' ' | cut -f2 -d' '); sudo /usr/lib/jvm/java-1.8.0/bin/jstack -l ${pid}</arg>
<arg>member_index=${index}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.692671" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.692481" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:19.692464" elapsed="0.000290"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.691950" elapsed="0.000828"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.691781" elapsed="0.001021"/>
</for>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.704793" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:21:19.704490" elapsed="0.000332"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:21:19.724644" elapsed="0.000216"/>
</kw>
<msg time="2026-04-26T00:21:19.724912" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:19.724015" elapsed="0.000965"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational', 'entity-ownership:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:19.723516" elapsed="0.001541"/>
</kw>
<msg time="2026-04-26T00:21:19.725104" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:19.714567" elapsed="0.010580"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:19.714179" elapsed="0.011042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:21:19.725881" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:21:19.725943" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:21:19.725640" elapsed="0.000327"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.728538" 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:21:19.728162" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.729026" 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:21:19.728723" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:19.729098" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:19.729249" 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:21:19.727780" elapsed="0.001494"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:21:19.729426" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.730094" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:21:19.729744" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.730525" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:19.730280" elapsed="0.000271"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.730951" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:19.730700" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.731370" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.731619" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.731474" elapsed="0.000225"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.731909" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.731758" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.732151" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:19.732005" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:19.731456" elapsed="0.000772"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:19.731203" elapsed="0.001049"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.731024" elapsed="0.001252"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:21:19.732315" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:21:19.732513" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:21:19.732559" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:21:19.727065" elapsed="0.005518"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.733215" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:21:19.733294" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:21:19.732755" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:21:19.733882" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.733607" elapsed="0.000366">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:21:19.733388" elapsed="0.000652">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:21:19.733370" elapsed="0.000702">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.734229" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.734405" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.734471" elapsed="0.000015"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.726242" elapsed="0.008333">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.734748" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.734911" elapsed="0.000035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:19.735093" elapsed="0.000020"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:21:19.725427" elapsed="0.009736">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:21:19.725275" elapsed="0.009943">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:21:19.735269" elapsed="0.000014"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:21:19.700345" elapsed="0.035015">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:29.752614" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:21:29.752257" elapsed="0.000390"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:21:29.772271" elapsed="0.000236"/>
</kw>
<msg time="2026-04-26T00:21:29.772560" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:29.771617" elapsed="0.000999"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:29.771153" elapsed="0.001539"/>
</kw>
<msg time="2026-04-26T00:21:29.772738" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:29.762317" elapsed="0.010463"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:29.761930" elapsed="0.011052"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:21:29.773593" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:21:29.773639" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:21:29.773353" elapsed="0.000309"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:29.776257" 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:21:29.775861" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:29.776732" 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:21:29.776450" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:29.776805" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:21:29.776995" 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:21:29.775494" elapsed="0.001526"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:21:29.777176" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:29.778028" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:21:29.777497" elapsed="0.000558"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:29.778463" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:29.778215" elapsed="0.000274"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:29.778875" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:29.778641" elapsed="0.000260"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:29.779310" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:29.779566" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:29.779418" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:29.779788" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:29.779646" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:29.780026" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:29.779866" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:29.779399" elapsed="0.000704"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:29.779141" elapsed="0.000986"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:29.778963" elapsed="0.001189"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:21:29.780191" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:21:29.780387" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:21:29.780433" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:21:29.774771" elapsed="0.005686"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:21:29.780895" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:21:29.781010" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:21:29.780628" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:21:29.781604" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:21:29.781332" elapsed="0.000348">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:21:29.781103" elapsed="0.000641">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:21:29.781085" elapsed="0.000691">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:29.781943" elapsed="0.000022"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:29.782118" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:29.782217" elapsed="0.000017"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:21:29.773962" elapsed="0.008361">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:29.782500" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:29.782665" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:29.782831" elapsed="0.000020"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:21:29.773211" elapsed="0.009691">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:21:29.773045" elapsed="0.009928">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:21:29.783025" elapsed="0.000015"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:21:29.748046" elapsed="0.035071">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:39.803962" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:21:39.803580" elapsed="0.000416"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:21:39.823737" elapsed="0.000262"/>
</kw>
<msg time="2026-04-26T00:21:39.824058" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:39.823061" elapsed="0.001062"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:39.822588" elapsed="0.001612"/>
</kw>
<msg time="2026-04-26T00:21:39.824246" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:39.813675" elapsed="0.010613"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:39.813284" elapsed="0.011075"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:21:39.824988" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:21:39.825034" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:21:39.824729" elapsed="0.000328"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:39.827883" 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:21:39.827495" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:39.828373" 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:21:39.828087" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:39.828447" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:21:39.828603" 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:21:39.827121" elapsed="0.001507"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:21:39.828781" elapsed="0.000174"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:39.829450" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:21:39.829118" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:39.829871" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:39.829634" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:39.830326" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:39.830065" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:39.830757" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:39.831126" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:39.830969" elapsed="0.000214"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:39.831352" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:39.831207" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:39.831597" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:39.831431" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:39.830948" elapsed="0.000729"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:39.830582" elapsed="0.001119"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:39.830399" elapsed="0.001329"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:21:39.831767" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:39.831980" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:21:39.832026" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:21:39.826201" elapsed="0.005849"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:21:39.832493" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:21:39.832570" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:21:39.832222" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:21:39.833173" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:21:39.832881" elapsed="0.000365">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:21:39.832663" elapsed="0.000649">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:21:39.832646" elapsed="0.000696">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:39.833495" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:39.833665" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:39.833730" elapsed="0.000014"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:21:39.825342" elapsed="0.008488">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:39.834015" elapsed="0.000022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:39.834211" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:39.834376" elapsed="0.000019"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:21:39.824588" elapsed="0.009857">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:21:39.824421" elapsed="0.010078">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:21:39.834548" elapsed="0.000014"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:21:39.799362" elapsed="0.035274">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:49.854982" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:21:49.854587" elapsed="0.000430"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:21:49.875185" elapsed="0.000262"/>
</kw>
<msg time="2026-04-26T00:21:49.875505" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:49.874522" elapsed="0.001045"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:49.874061" elapsed="0.001584"/>
</kw>
<msg time="2026-04-26T00:21:49.875773" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:49.864937" elapsed="0.010884"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:49.864534" elapsed="0.011361"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:21:49.876755" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:21:49.876817" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:21:49.876430" elapsed="0.000419"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:49.880502" 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:21:49.879957" elapsed="0.000582"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:49.881181" 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:21:49.880761" elapsed="0.000455"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:49.881281" elapsed="0.000041"/>
</return>
<msg time="2026-04-26T00:21:49.881493" 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:21:49.879429" elapsed="0.002099"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:21:49.881738" elapsed="0.000233"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:49.882650" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:21:49.882195" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:49.883249" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:49.882901" elapsed="0.000382"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:49.883844" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:49.883519" elapsed="0.000359"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:49.884397" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:49.884651" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:49.884504" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:49.884869" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:49.884729" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:49.885107" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:49.884959" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:49.884485" elapsed="0.000694"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:49.884229" elapsed="0.000974"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:49.883973" elapsed="0.001256"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:21:49.885268" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:21:49.885460" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:21:49.885504" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:21:49.878421" elapsed="0.007105"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:21:49.885977" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:21:49.886059" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:21:49.885694" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:21:49.886629" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:21:49.886361" elapsed="0.000340">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:21:49.886147" elapsed="0.000656">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:21:49.886130" elapsed="0.000707">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:49.887005" elapsed="0.000022"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:49.887180" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:49.887245" elapsed="0.000015"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:21:49.877264" elapsed="0.010083">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:49.887551" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:49.887712" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:49.887873" elapsed="0.000020"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:21:49.876233" elapsed="0.011726">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:21:49.875978" elapsed="0.012036">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:21:49.888063" elapsed="0.000014"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:21:49.849357" elapsed="0.038796">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:21:59.905487" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:21:59.905110" elapsed="0.000411"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:21:59.925293" elapsed="0.000238"/>
</kw>
<msg time="2026-04-26T00:21:59.925592" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:59.924631" elapsed="0.001024"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:59.924141" elapsed="0.001592"/>
</kw>
<msg time="2026-04-26T00:21:59.925779" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:21:59.915285" elapsed="0.010536"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:21:59.914882" elapsed="0.011010"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:21:59.926525" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:21:59.926569" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:21:59.926284" elapsed="0.000308"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:59.929201" 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:21:59.928806" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:59.929668" 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:21:59.929387" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:21:59.929741" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:21:59.929897" 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:21:59.928413" elapsed="0.001524"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:21:59.930091" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:21:59.930725" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:21:59.930401" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:59.931238" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:59.931000" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:21:59.931647" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:21:59.931416" elapsed="0.000257"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:59.932079" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:59.932338" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:59.932189" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:59.932576" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:59.932417" elapsed="0.000214"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:59.932796" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:21:59.932654" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:21:59.932169" elapsed="0.000701"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:21:59.931896" elapsed="0.000997"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:59.931719" elapsed="0.001214"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:21:59.932974" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:21:59.933169" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:21:59.933214" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:21:59.927700" elapsed="0.005537"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:21:59.933681" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:21:59.933757" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:21:59.933413" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:21:59.934529" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:21:59.934252" elapsed="0.000348">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:21:59.933849" elapsed="0.000817">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:21:59.933831" elapsed="0.000866">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:59.934851" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:59.935041" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:21:59.935108" elapsed="0.000015"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:21:59.926875" elapsed="0.008334">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:59.935379" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:59.935543" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:21:59.935707" elapsed="0.000020"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:21:59.926142" elapsed="0.009635">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:21:59.925969" elapsed="0.009861">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:21:59.935881" elapsed="0.000014"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:21:59.900857" elapsed="0.035130">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:22:09.955996" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:22:09.955602" elapsed="0.000429"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:22:09.975788" elapsed="0.000255"/>
</kw>
<msg time="2026-04-26T00:22:09.976099" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:09.975055" elapsed="0.001107"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:09.974587" elapsed="0.001652"/>
</kw>
<msg time="2026-04-26T00:22:09.976285" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:09.965643" elapsed="0.010685"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:09.965256" elapsed="0.011152"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:22:09.977031" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:22:09.977076" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:22:09.976774" elapsed="0.000325"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:09.979698" 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:22:09.979320" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:09.980184" 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:22:09.979884" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:09.980258" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:22:09.980413" 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:22:09.978954" elapsed="0.001483"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:22:09.980589" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:09.981246" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:22:09.980900" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:09.981659" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:09.981427" elapsed="0.000257"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:09.982299" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:09.981856" elapsed="0.000469"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:09.982722" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:09.982992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:09.982829" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:09.983213" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:09.983072" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:09.983431" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:09.983290" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:09.982811" elapsed="0.000692"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:09.982552" elapsed="0.000975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:09.982372" elapsed="0.001180"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:22:09.983590" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:09.983784" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:22:09.983828" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:22:09.978234" elapsed="0.005616"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:22:09.984344" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:22:09.984419" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:22:09.984069" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:22:09.985018" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:22:09.984727" elapsed="0.000366">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:22:09.984511" elapsed="0.000647">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:22:09.984493" elapsed="0.000696">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:09.985341" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:09.985512" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:09.985579" elapsed="0.000015"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:22:09.977387" elapsed="0.008299">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:09.985871" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:09.986055" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:09.986226" elapsed="0.000020"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:22:09.976633" elapsed="0.009663">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:22:09.976469" elapsed="0.009881">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:22:09.986400" elapsed="0.000015"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:22:09.950068" elapsed="0.036422">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.004170" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:22:20.003792" elapsed="0.000412"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:22:20.023897" elapsed="0.000245"/>
</kw>
<msg time="2026-04-26T00:22:20.024196" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:20.023256" elapsed="0.000999"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:20.022773" elapsed="0.001559"/>
</kw>
<msg time="2026-04-26T00:22:20.024378" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:20.013898" elapsed="0.010523"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:20.013514" elapsed="0.010979"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:22:20.025122" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:22:20.025167" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:22:20.024864" elapsed="0.000327"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.028028" 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:22:20.027625" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.028504" 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:22:20.028217" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.028578" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:22:20.028733" 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:22:20.027062" elapsed="0.001696"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:22:20.028995" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.029647" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:22:20.029315" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.030089" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:20.029831" elapsed="0.000285"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.030498" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:20.030263" elapsed="0.000262"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.030958" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.031231" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.031082" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.031454" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.031312" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.031672" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.031531" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:20.031062" elapsed="0.000684"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.030750" elapsed="0.001019"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.030570" elapsed="0.001225"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:22:20.031837" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:22:20.032049" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:22:20.032096" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:22:20.026321" elapsed="0.005798"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.032559" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:22:20.032636" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:22:20.032290" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.033243" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.032959" elapsed="0.000355">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:22:20.032728" elapsed="0.000649">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:22:20.032710" elapsed="0.000699">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.033561" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.033740" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.033806" elapsed="0.000014"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.025481" elapsed="0.008426">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.034096" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.034259" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.034423" elapsed="0.000021"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:22:20.024723" elapsed="0.009770">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:22:20.024553" elapsed="0.009994">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.034597" elapsed="0.000014"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:22:19.998412" elapsed="0.036275">No leader found.</status>
</kw>
<msg time="2026-04-26T00:22:20.034782" level="FAIL">Keyword 'ShardStability.Shards_Stability_Get_Details' failed after retrying for 1 minute. The last error was: No leader found.</msg>
<arg>60s</arg>
<arg>10s</arg>
<arg>ShardStability.Shards_Stability_Get_Details</arg>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.692979" elapsed="60.341985">Keyword 'ShardStability.Shards_Stability_Get_Details' failed after retrying for 1 minute. The last error was: No leader found.</status>
</kw>
<doc>Start each member and wait for sync.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:21:19.639382" elapsed="60.395749">Keyword 'ShardStability.Shards_Stability_Get_Details' failed after retrying for 1 minute. The last error was: No leader found.</status>
</test>
<kw name="Close All Connections" owner="SSHLibrary" type="TEARDOWN">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-26T00:22:20.035586" elapsed="0.000122"/>
</kw>
<doc>Unset tell-based protocol usage

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

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

Suite stops all odl nodes, outcomment usage of tell-based protocol in
config file (means make it false by default) and starts all nodes again.</doc>
<status status="FAIL" start="2026-04-26T00:21:19.380038" elapsed="60.655704"/>
</suite>
<suite id="s1-s4" name="Entity" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/entity.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.157517" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:22:20.153427" elapsed="0.004145"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-26T00:22:20.153205" elapsed="0.004437"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.162342" 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:22:20.158695" elapsed="0.003676"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-26T00:22:20.162571" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.162453" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.162430" elapsed="0.000206"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.163188" 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:22:20.162789" elapsed="0.000442"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.163701" 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:22:20.163390" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-26T00:22:20.164241" elapsed="0.000279"/>
</kw>
<msg time="2026-04-26T00:22:20.164616" level="INFO">${status} = PASS</msg>
<msg time="2026-04-26T00:22:20.164662" 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:22:20.163887" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.165238" 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:22:20.164850" elapsed="0.000414"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.166221" 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:22:20.165954" elapsed="0.000294"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.166651" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:20.166396" elapsed="0.000281"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.167159" 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:22:20.166837" elapsed="0.000349"/>
</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:22:20.169732" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.169549" elapsed="0.000256"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.167238" elapsed="0.002595"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.170412" 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:22:20.170010" elapsed="0.000445"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.171054" 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:22:20.170615" elapsed="0.000482"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.171639" 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:22:20.171256" elapsed="0.000426"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-26T00:22:20.165496" elapsed="0.006243"/>
</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:22:20.158364" elapsed="0.013492"/>
</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:22:20.172053" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.171937" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.171904" elapsed="0.000216"/>
</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:22:20.175303" 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:22:20.174874" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.175773" 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:22:20.175489" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.175842" elapsed="0.000034"/>
</return>
<msg time="2026-04-26T00:22:20.176019" 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:22:20.174548" elapsed="0.001496"/>
</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:22:20.176375" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.176204" elapsed="0.000231"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.176096" elapsed="0.000364"/>
</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:22:20.172334" elapsed="0.004179"/>
</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:22:20.176665" elapsed="0.000208"/>
</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:22:20.177190" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.177055" elapsed="0.000199"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.176938" elapsed="0.000341"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-26T00:22:20.157944" elapsed="0.019387"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.179860" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.179750" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.179732" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.184674" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.184566" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.184548" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.185683" 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:22:20.185303" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.186176" 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:22:20.185873" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.186247" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:22:20.186399" 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:22:20.184977" 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:22:20.186760" 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:22:20.187014" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.186856" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:20.186839" elapsed="0.000277"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.186620" elapsed="0.000519"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.186473" elapsed="0.000690"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:22:20.184278" elapsed="0.002938"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-26T00:22:20.177890" elapsed="0.009429"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:22:20.177481" elapsed="0.009882"/>
</kw>
<arg>http_timeout=2</arg>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-26T00:22:20.152877" elapsed="0.034536"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.188316" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-26T00:22:20.187986" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-04-26T00:22:20.188512" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-26T00:22:20.188416" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.188398" elapsed="0.000195"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.188748" elapsed="0.000022"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.188937" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.189115" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.189293" elapsed="0.000020"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.189537" elapsed="0.000024"/>
</kw>
<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:22:20.187675" elapsed="0.001947"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.190624" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:22:20.190149" elapsed="0.000502"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.194457" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:22:20.190811" elapsed="0.003692"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.197867" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.194576" elapsed="0.003367"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.194558" elapsed="0.003412"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-26T00:22:20.202883" level="INFO">${odl_connection} = 2</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-26T00:22:20.202475" elapsed="0.000435"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.204555" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:22:20.204632" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:22:20.204274" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:20.204815" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-26T00:22:20.205998" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-26T00:22:20.206288" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.205665" elapsed="0.001086">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:22:20.206809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.205317" elapsed="0.001540"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.203831" elapsed="0.003150">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:22:20.207047" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.203451" elapsed="0.003653"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.203126" elapsed="0.004078">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.207297" elapsed="0.000019"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.202183" elapsed="0.005216">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.207566" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.207733" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-26T00:22:20.207854" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.207815" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:20.207798" elapsed="0.000114"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.212135" elapsed="0.000032"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.198216" elapsed="0.014092">OSError: [Errno 16] Device or resource busy</status>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.189854" elapsed="0.022544">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${node1_session}</var>
<arg>member_index=1</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.212616" elapsed="0.000024"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${node2_session}</var>
<arg>member_index=2</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.212839" elapsed="0.000022"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${node3_session}</var>
<arg>member_index=3</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.213069" elapsed="0.000024"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${node1_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.213247" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${node2_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.213413" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${node3_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.213580" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${directory_with_template_folders}</arg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.213746" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${empty_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.213932" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${cont}</var>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.214101" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${contend}</var>
<arg>&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.214266" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_data}</arg>
<arg>${cont}Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.214435" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${modified_data}</arg>
<arg>${cont}Modified Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.214601" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${modified_data_2}</arg>
<arg>${cont}Another Modified Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.214766" elapsed="0.000020"/>
</kw>
<doc>Setup everything needed for the test cases.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.152587" elapsed="0.062289">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s4-t1" name="Start_Testtool" line="63">
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.214960" elapsed="0.000429">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" line="69">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.215568" elapsed="0.000404">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t3" name="Configure_Device_On_Netconf" line="75">
<doc>Use node 1 to configure a testtool device on Netconf connector.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.216138" elapsed="0.000355">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t4" name="Wait_For_Device_To_Become_Visible_For_All_Nodes" line="83">
<doc>Wait for the whole cluster to see the device.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.216657" elapsed="0.000382">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t5" name="Check_Config_Data_Before_Data_Creation" line="89">
<doc>Check if there really is no data present on none of the nodes</doc>
<status status="FAIL" start="2026-04-26T00:22:20.217202" elapsed="0.000372">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t6" name="Create_Device_Data" line="110">
<doc>Create some data on the device and propagate it throughout the cluster.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.217736" elapsed="0.000364">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t7" name="Check_Config_Data_After_Data_Creation" line="120">
<doc>Check if the data we just added into the cluster is really there</doc>
<status status="FAIL" start="2026-04-26T00:22:20.218263" elapsed="0.000369">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t8" name="Find_And_Shutdown_Device_Entity_Owner" line="141">
<doc>Simulate a failure of the owner of the entity that represents the device.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.218835" elapsed="0.000432">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t9" name="Wait_For_New_Owner_To_Appear" line="161">
<doc>Wait for the cluster to recover from the failure and choose a new owner for the entity.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:22:20.219429" elapsed="0.000409">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t10" name="Check_Config_Data_Before_Modification_With_Original_Owner_Down" line="166">
<doc>Check if data is present and retrievable from follower nodes</doc>
<status status="FAIL" start="2026-04-26T00:22:20.220018" elapsed="0.000416">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t11" name="Modify_Device_Data_When_Original_Owner_Is_Down" line="182">
<doc>Attempt to modify the data on the device after recovery and see if it still works.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.220592" elapsed="0.000438">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t12" name="Check_Config_Data_After_Modification_With_Original_Owner_Down" line="193">
<doc>Check if data is written correctly when original owner is shut down</doc>
<status status="FAIL" start="2026-04-26T00:22:20.221194" elapsed="0.000419">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t13" name="Restart_Original_Entity_Owner" line="209">
<doc>Restart the original entity owner and see if it can still see the device and the new data on it.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.221776" elapsed="0.000416">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t14" name="Check_Config_Data_After_Original_Owner_Restart" line="213">
<doc>Sanity check if we still can retrieve our data from the original device owner.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.222349" elapsed="0.000406">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t15" name="Modify_Device_Data_With_Original_Owner" line="223">
<doc>Check that the original owner of the entity is still able to modify the data on the device</doc>
<status status="FAIL" start="2026-04-26T00:22:20.222911" elapsed="0.000471">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t16" name="Check_Config_Data_After_Modification_With_Original_Owner_Up" line="234">
<doc>Check if data has really been written as we expect. Fails if Modify_Device_Data_With_Original_Owner fails.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.223545" elapsed="0.000500">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-t17" name="Deconfigure_Device_In_Netconf" line="255">
<doc>Make request to deconfigure the device on Netconf connector and see if it works.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:22:20.224207" elapsed="0.000408">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-26T00:22:20.225314" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-26T00:22:20.225240" elapsed="0.000123"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.226345" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:22:20.226032" elapsed="0.000340"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-26T00:22:20.226708" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.226522" elapsed="0.000867">Cannot open session, you need to establish a connection first.</status>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.225810" elapsed="0.001699">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-26T00:22:20.227825" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.227668" elapsed="0.000726">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-26T00:22:20.232417" level="FAIL">Variable '${testtool_log}' not found.</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.228557" elapsed="0.003894">Variable '${testtool_log}' not found.</status>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.225558" elapsed="0.007012">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.225028" elapsed="0.007647">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>Test suite for netconf device entity ownership handling during outages.

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

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


Perform basic operations (Create, Read, Update and Delete or CRUD) on device
data mounted onto a netconf connector and see if they work.

The suite recognizes 3 nodes, "CONFIGURER" (the node that configures the
device at the beginning and then deconfigures it at the end), "SETTER" (the
node that manipulates the data on the device) and "CHECKER" (the node that
checks the data on the device). The configured device and the results of each
data operation on it is expected to be visible on all nodes so after each
operation three test cases make sure they can see the result on their
respective nodes.

The 3 nodes are configured by placing "node1", "node2" or "node3" into the
${NODE_CONFIGURER}, ${NODE_SETTER} and ${NODE_CHECKER} to make the node
a "CONFIGURER", "SETTER" and "CHECKER" respectively. The "nodeX" name refers
to the node with its IP address configured with the ${ODL_SYSTEM_X_IP}
variable where the "X" is 1, 2 or 3.

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.036341" elapsed="0.196404">Suite setup failed:
OSError: [Errno 16] Device or resource busy

Also suite teardown failed:
Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</suite>
<suite id="s1-s5" name="Restart Odl With Tell Based False" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/controller/dom_data_broker/restart_odl_with_tell_based_false.robot">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils" type="SETUP">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.337247" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:22:20.332871" elapsed="0.004424"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-26T00:22:20.332650" elapsed="0.004704"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.342511" 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:22:20.338399" elapsed="0.004140"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-26T00:22:20.342715" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.342615" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.342595" elapsed="0.000184"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.343322" 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:22:20.342949" elapsed="0.000416"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.343833" 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:22:20.343527" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-26T00:22:20.344371" elapsed="0.000273"/>
</kw>
<msg time="2026-04-26T00:22:20.344738" level="INFO">${status} = PASS</msg>
<msg time="2026-04-26T00:22:20.344784" 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:22:20.344039" elapsed="0.000767"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.345349" 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:22:20.344987" elapsed="0.000389"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.346328" 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:22:20.346070" elapsed="0.000285"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.346751" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:20.346503" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.347247" 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:22:20.346950" elapsed="0.000324"/>
</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:22:20.349826" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.349642" elapsed="0.000256"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.347324" elapsed="0.002615"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.350493" 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:22:20.350112" elapsed="0.000423"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.351089" 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:22:20.350699" elapsed="0.000474"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.351711" 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:22:20.351344" elapsed="0.000409"/>
</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:22:20.345608" elapsed="0.006201"/>
</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:22:20.338064" elapsed="0.013800"/>
</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:22:20.352058" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.351944" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.351909" elapsed="0.000215"/>
</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:22:20.355413" 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:22:20.355021" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.355937" 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:22:20.355635" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.356009" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:22:20.356163" 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:22:20.354683" elapsed="0.001505"/>
</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:22:20.356516" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.356344" elapsed="0.000231"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.356238" elapsed="0.000362"/>
</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:22:20.352341" elapsed="0.004310"/>
</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:22:20.356802" elapsed="0.000230"/>
</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:22:20.357333" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.357196" elapsed="0.000200"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.357082" elapsed="0.000339"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-26T00:22:20.337627" elapsed="0.019845"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.360168" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.360059" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.360040" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.365197" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.365091" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.365074" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.366204" 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:22:20.365807" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.366675" 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:22:20.366391" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.366745" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:20.366894" 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:22:20.365483" elapsed="0.001451"/>
</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:22:20.367319" 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:22:20.367559" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.367415" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:20.367399" elapsed="0.000235"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.367166" elapsed="0.000490"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.366985" elapsed="0.000696"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:22:20.364794" elapsed="0.002939"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-26T00:22:20.358048" elapsed="0.009737"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:22:20.357623" elapsed="0.010202"/>
</kw>
<arg>http_timeout=125</arg>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-26T00:22:20.332332" elapsed="0.035541"/>
</kw>
<test id="s1-s5-t1" name="Stop_All_Members" line="30">
<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:22:20.373574" 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:22:20.373162" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.374065" 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:22:20.373764" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.374137" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:20.374288" 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:22:20.372771" elapsed="0.001542"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.375348" 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:22:20.374944" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.375813" 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:22:20.375534" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.375881" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:20.376050" 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:22:20.374519" elapsed="0.001556"/>
</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:22:20.377519" 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:22:20.377147" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.378008" 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:22:20.377707" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.378079" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:22:20.378231" 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:22:20.376752" elapsed="0.001504"/>
</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:22:20.378586" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.378414" elapsed="0.000232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.378306" elapsed="0.000366"/>
</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:22:20.376277" elapsed="0.002448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.379198" 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:22:20.378877" elapsed="0.000347"/>
</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:22:20.379379" elapsed="0.000194"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.379747" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:22:20.379643" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.379626" 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:22:20.380124" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.379979" elapsed="0.000207"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.379849" elapsed="0.000363"/>
</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:22:20.383640" 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:22:20.383246" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.384136" 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:22:20.383832" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.384207" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:22:20.384360" 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:22:20.382794" elapsed="0.001591"/>
</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:22:20.384752" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.384579" elapsed="0.000233"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.384470" elapsed="0.000367"/>
</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:22:20.380407" elapsed="0.004482"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-26T00:22:20.384944" 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:22:20.368492" elapsed="0.016575"/>
</kw>
<doc>Stop every odl node.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-26T00:22:20.367942" elapsed="0.017221"/>
</test>
<test id="s1-s5-t2" name="Unset_Tell_Based_Protocol_Usage" line="34">
<kw name="Change_Use_Tell_Based_Protocol" owner="DdbCommons">
<kw name="Check_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:22:20.389462" 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:22:20.389077" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.389952" 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:22:20.389653" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.390026" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:22:20.390181" 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:22:20.388681" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.390520" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.390367" elapsed="0.000224"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.390258" elapsed="0.000359"/>
</for>
<arg>sed -ie "s/^#use-tell-based-protocol=true/use-tell-based-protocol=true/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:22:20.386289" elapsed="0.004381"/>
</kw>
<kw name="Check_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:22:20.394075" 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:22:20.393682" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.394552" 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:22:20.394266" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.394623" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:20.394774" 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:22:20.393306" elapsed="0.001493"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.395123" elapsed="0.000034"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.394972" elapsed="0.000233"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.394849" elapsed="0.000382"/>
</for>
<arg>sed -ie "s/^#use-tell-based-protocol=false/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:22:20.390893" elapsed="0.004390"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"${status}" == "True"</arg>
<arg>ClusterManagement.Check_Bash_Command_On_List_Or_All</arg>
<arg>sed -ie "s/^use-tell-based-protocol=false/use-tell-based-protocol=true/g" ${DATASTORE_CFG}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:20.395443" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Check_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:22:20.399802" 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:22:20.399426" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.400294" 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:22:20.400007" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.400409" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:22:20.400561" 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:22:20.398998" elapsed="0.001587"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.400896" elapsed="0.000039"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.400742" elapsed="0.000240"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.400636" elapsed="0.000373"/>
</for>
<arg>sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:22:20.396412" elapsed="0.004649"/>
</kw>
<msg time="2026-04-26T00:22:20.401100" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>"${status}" == "False"</arg>
<arg>ClusterManagement.Check_Bash_Command_On_List_Or_All</arg>
<arg>sed -ie "s/^use-tell-based-protocol=true/use-tell-based-protocol=false/g" ${DATASTORE_CFG}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:20.395931" elapsed="0.005216"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>Failure in status. Status can be True or False.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.401306" elapsed="0.000021"/>
</kw>
<arg>False</arg>
<arg>${DATASTORE_CFG}</arg>
<doc>Change status use-tell-based-protocol to True or False</doc>
<status status="PASS" start="2026-04-26T00:22:20.385869" elapsed="0.015520"/>
</kw>
<kw name="Check_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:22:20.404703" 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:22:20.404331" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.405188" 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:22:20.404889" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.405257" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:22:20.405405" 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:22:20.403961" elapsed="0.001468"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.405732" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.405583" elapsed="0.000218"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.405478" elapsed="0.000349"/>
</for>
<arg>cat ${DATASTORE_CFG}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:22:20.401609" elapsed="0.004269"/>
</kw>
<kw name="Clean_Directories_On_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.415564" level="INFO">${path_list} = ['tmp/', 'data/', 'cache/', 'snapshots/', 'journal/', 'segmented-journal/', 'etc/opendaylight/current/', 'etc/host.key']</msg>
<var>${path_list}</var>
<arg>"${directory_list}" == "${EMPTY}"</arg>
<arg>${ODL_DEFAULT_DATA_PATHS}</arg>
<arg>${directory_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:22:20.413290" elapsed="0.002302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${tmp_dir}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Check_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:22:20.417276" 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:22:20.416891" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.417742" 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:22:20.417463" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.417811" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:20.417976" 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:22:20.416526" elapsed="0.001475"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.418304" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.418157" elapsed="0.000250"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.418051" elapsed="0.000382"/>
</for>
<arg>mkdir -p '${tmp_dir}' &amp;&amp; rm -vrf '${tmp_dir}/log' &amp;&amp; mv -vf '${karaf_home}/data/log' '${tmp_dir}/'</arg>
<arg>${member_index_list}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:22:20.415946" elapsed="0.002540"/>
</kw>
<status status="PASS" start="2026-04-26T00:22:20.415670" elapsed="0.002850"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.415651" elapsed="0.002894"/>
</if>
<kw name="Safe_With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-26T00:22:20.421204" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-26T00:22:20.419837" elapsed="0.001504"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="With_Ssh_To_List_Or_All_Run_Keyword" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>This keyword is experimental and there is high risk of being replaced by another approach.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-26T00:22:20.422451" elapsed="0.000211"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.423667" 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:22:20.423293" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.424156" 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:22:20.423856" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.424226" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:22:20.424377" 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:22:20.422871" elapsed="0.001531"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<var>${member_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.424733" elapsed="0.000024"/>
</kw>
<kw name="Run_Unsafely_Keyword_Over_Temporary_Odl_Session" owner="SSHKeywords">
<arg>${member_ip}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Open connection to given IP address, run keyword, close connection, return result.
This is unsafe in the sense that previously active session will be switched out off, but safe in the sense only the temporary connection is closed.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.425028" elapsed="0.000025"/>
</kw>
<var name="${member_index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.424567" elapsed="0.000528"/>
</iter>
<var>${member_index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.424453" elapsed="0.000669"/>
</for>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>For each index in given list (or all): activate SSH connection, run given Keyword, close active connection. Return None.
Beware that in order to avoid "got positional argument after named arguments", first two arguments in the call should not be named.</doc>
<status status="PASS" start="2026-04-26T00:22:20.422025" elapsed="0.003150"/>
</kw>
<msg time="2026-04-26T00:22:20.425216" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:20.421502" elapsed="0.003762"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:20.428243" elapsed="0.000305"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-26T00:22:20.428716" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-26T00:22:20.429041" elapsed="0.000103"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-26T00:22:20.425558" elapsed="0.003639"/>
</kw>
<arg>With_Ssh_To_List_Or_All_Run_Keyword</arg>
<arg>${member_index_list}</arg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-26T00:22:20.419359" elapsed="0.009896"/>
</kw>
<arg>${member_index_list}</arg>
<arg>ClusterManagement__Clean_Directories</arg>
<arg>${path_list}</arg>
<arg>${karaf_home}</arg>
<doc>Remember active ssh connection index, call With_Ssh_To_List_Or_All_Run_Keyword, return None. Restore the conection index on teardown.</doc>
<status status="PASS" start="2026-04-26T00:22:20.418705" elapsed="0.010613"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${tmp_dir}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Check_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:22:20.431033" 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:22:20.430635" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.431561" 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:22:20.431271" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.431666" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:22:20.431821" 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:22:20.430262" elapsed="0.001584"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<arg>return_success_only=${return_success_only}</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.432175" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.432022" elapsed="0.000224"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.431896" elapsed="0.000376"/>
</for>
<arg>mkdir -p '${karaf_home}/data' &amp;&amp; rm -vrf '${karaf_home}/log' &amp;&amp; mv -vf '${tmp_dir}/log' '${karaf_home}/data/'</arg>
<arg>${member_index_list}</arg>
<doc>Cycle through indices (or all), run bash command on each, using temporary SSH session and restoring the previously active one.</doc>
<status status="PASS" start="2026-04-26T00:22:20.429658" elapsed="0.002667"/>
</kw>
<status status="PASS" start="2026-04-26T00:22:20.429389" elapsed="0.002971"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.429371" elapsed="0.003014"/>
</if>
<arg>tmp_dir=/tmp</arg>
<doc>Clear @{directory_list} or ['tmp/', 'data/', 'cache/', 'snapshots/', 'journal/', 'segmented-journal/', 'etc/opendaylight/current/', 'etc/host.key'] for members in given list or all. Return None.
If ${tmp_dir} is nonempty, use that location to preserve data/log/.
This is intended to return Karaf (offline) to the state it was upon the first boot.</doc>
<status status="PASS" start="2026-04-26T00:22:20.409160" elapsed="0.023269"/>
</kw>
<doc>Comment out the flag usage in config file. Also clean most data except data/log/.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-26T00:22:20.385334" elapsed="0.047196"/>
</test>
<test id="s1-s5-t3" name="Start_All_And_Sync" line="40">
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.445898" level="INFO">${base_command} = /tmp/karaf-0.22.3-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:22:20.445524" elapsed="0.000416"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.446476" level="INFO">${command} = /tmp/karaf-0.22.3-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:22:20.446115" elapsed="0.000387"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-26T00:22:20.446936" level="INFO">${epoch} = 1777162940.446852</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:22:20.446666" elapsed="0.000297"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.447578" level="INFO">${gc_filepath} = /tmp/karaf-0.22.3-SNAPSHOT/data/log/gc_1777162940.446852.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:22:20.447132" elapsed="0.000472"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.448170" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.22.3-SNAPSHOT/data/log/gc_1777162940.446852.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:22:20.447776" elapsed="0.000421"/>
</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:22:20.449672" 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:22:20.449300" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.450160" 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:22:20.449859" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.450229" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:22:20.450381" 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:22:20.448913" 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:22:20.450735" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.450563" elapsed="0.000232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.450456" elapsed="0.000365"/>
</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:22:20.448407" elapsed="0.002466"/>
</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:22:20.462770" 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:22:20.462354" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.463367" 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:22:20.463016" elapsed="0.000379"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.463441" elapsed="0.000030"/>
</return>
<msg time="2026-04-26T00:22:20.463597" 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:22:20.461981" elapsed="0.001641"/>
</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:22:20.464090" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-26T00:22:20.464223" elapsed="0.000017"/>
</continue>
<status status="NOT RUN" start="2026-04-26T00:22:20.464183" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:20.464166" elapsed="0.000122"/>
</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:22:20.464434" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.463838" elapsed="0.000648"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.463674" elapsed="0.000839"/>
</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:22:20.461574" elapsed="0.002993"/>
</kw>
<status status="PASS" start="2026-04-26T00:22:20.461270" elapsed="0.003329"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.461251" elapsed="0.003372"/>
</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:22:20.466267" 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:22:20.465690" elapsed="0.000604"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.466748" 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:22:20.466459" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.466819" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:22:20.466989" 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:22:20.465319" elapsed="0.001695"/>
</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:22:20.467360" 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:22:20.471407" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.467192" elapsed="0.004282"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.467066" elapsed="0.004436"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-26T00:22:20.464949" elapsed="0.006607"/>
</kw>
<status status="PASS" start="2026-04-26T00:22:20.464677" elapsed="0.006908"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.464661" elapsed="0.006947"/>
</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:22:20.472004" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.471664" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-26T00:22:20.471647" elapsed="0.000440"/>
</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:22:20.460843" elapsed="0.011291"/>
</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:22:20.451050" elapsed="0.021142"/>
</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:22:20.475558" 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:22:20.475155" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.476052" 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:22:20.475748" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.476123" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:20.476311" 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:22:20.474734" elapsed="0.001602"/>
</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:22:20.476671" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.476497" elapsed="0.000234"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.476388" elapsed="0.000369"/>
</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:22:20.472456" elapsed="0.004354"/>
</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:22:20.437556" elapsed="0.039304"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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:22:20.480571" 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:22:20.480196" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.481062" 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:22:20.480760" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.481133" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:22:20.481285" 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:22:20.479802" elapsed="0.001508"/>
</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:22:20.481638" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.481467" elapsed="0.000230"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.481360" elapsed="0.000363"/>
</for>
<arg>netstat -punta</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-26T00:22:20.477553" elapsed="0.004222"/>
</kw>
<arg>60s</arg>
<arg>10s</arg>
<arg>ClusterManagement.Run_Bash_Command_On_List_Or_All</arg>
<arg>netstat -punta</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-26T00:22:20.477034" elapsed="0.004787"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.484777" 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:22:20.484400" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.485271" 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:22:20.484987" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.485341" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:20.485491" level="INFO">${index_list} = []</msg>
<var>${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:22:20.482043" elapsed="0.003472"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<var>${output}</var>
<arg>command=sudo netstat -punta | grep 2550 | grep LISTEN</arg>
<arg>member_index=${index}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.485889" elapsed="0.000023"/>
</kw>
<kw name="Get Match">
<var>${listening}</var>
<arg>${output}</arg>
<arg>LISTEN</arg>
<doc>Wrapper around String.Get Regexp Matches to return None if not found or the first match if found.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.486121" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${listening}' == 'None'">
<kw name="Check_Bash_Command_On_Member" owner="ClusterManagement">
<arg>command=pid=$(grep org.apache.karaf.main.Main | grep -v grep | tr -s ' ' | cut -f2 -d' '); sudo /usr/lib/jvm/java-1.8.0/bin/jstack -l ${pid}</arg>
<arg>member_index=${index}</arg>
<doc>Open SSH session, call SSHKeywords.Execute_Command_Passes, close session, restore previously active session and return output.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.486399" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.486212" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:20.486196" elapsed="0.000285"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.485713" elapsed="0.000791"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.485562" elapsed="0.000967"/>
</for>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.498349" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:22:20.498052" elapsed="0.000324"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:22:20.518264" elapsed="0.000215"/>
</kw>
<msg time="2026-04-26T00:22:20.518526" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:20.517585" elapsed="0.000990"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational', 'entity-ownership:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:20.517126" elapsed="0.001523"/>
</kw>
<msg time="2026-04-26T00:22:20.518695" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:20.508163" elapsed="0.010574"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:20.507765" elapsed="0.011045"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:22:20.519417" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:22:20.519463" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:22:20.519168" elapsed="0.000318"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.522045" 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:22:20.521650" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.522512" 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:22:20.522232" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:20.522581" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:20.522729" 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:22:20.521285" elapsed="0.001468"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:22:20.522906" elapsed="0.000373"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.523794" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:22:20.523456" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.524245" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:20.524003" elapsed="0.000268"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.524658" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:20.524421" elapsed="0.000262"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.525093" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.525350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.525205" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.525568" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.525428" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.525785" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:20.525644" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:20.525188" elapsed="0.000670"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:20.524909" elapsed="0.000972"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.524729" elapsed="0.001176"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:22:20.525959" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:22:20.526154" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:22:20.526198" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:22:20.520575" elapsed="0.005646"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.526700" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:22:20.526776" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:22:20.526431" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:22:20.527420" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.527106" elapsed="0.000385">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:22:20.526868" elapsed="0.000689">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:22:20.526849" elapsed="0.000740">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.527744" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.527933" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.528001" elapsed="0.000015"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.519758" elapsed="0.008346">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.528277" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.528441" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:20.528605" elapsed="0.000019"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:22:20.519029" elapsed="0.009645">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:22:20.518862" elapsed="0.009865">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:22:20.528777" elapsed="0.000014"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:22:20.493872" elapsed="0.034995">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:22:30.547502" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:22:30.547131" elapsed="0.000406"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:22:30.567303" elapsed="0.000244"/>
</kw>
<msg time="2026-04-26T00:22:30.567602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:30.566625" elapsed="0.001041"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:30.566160" elapsed="0.001584"/>
</kw>
<msg time="2026-04-26T00:22:30.567791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:30.557251" elapsed="0.010583"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:30.556841" elapsed="0.011065"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:22:30.568576" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:22:30.568620" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:22:30.568307" elapsed="0.000336"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:30.571552" 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:22:30.571155" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:30.572056" 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:22:30.571752" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:30.572138" elapsed="0.000034"/>
</return>
<msg time="2026-04-26T00:22:30.572302" 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:22:30.570760" elapsed="0.001567"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:22:30.572600" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:30.573337" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:22:30.572949" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:30.573764" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:30.573525" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:30.574195" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:30.573958" elapsed="0.000263"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:30.574619" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:30.574876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:30.574728" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:30.575122" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:30.574973" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:30.575341" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:30.575199" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:30.574708" elapsed="0.000706"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:30.574450" elapsed="0.000988"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:30.574269" elapsed="0.001195"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:22:30.575503" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:30.575697" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:22:30.575743" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:22:30.569790" elapsed="0.005976"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:22:30.576230" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:22:30.576305" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:22:30.575953" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:22:30.576941" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:22:30.576646" elapsed="0.000370">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:22:30.576424" elapsed="0.000660">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:22:30.576405" elapsed="0.000710">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:30.577269" elapsed="0.000022"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:30.577441" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:30.577507" elapsed="0.000014"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:22:30.568961" elapsed="0.008646">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:30.577778" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:30.577956" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:30.578123" elapsed="0.000020"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:22:30.568162" elapsed="0.010031">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:22:30.567987" elapsed="0.010259">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:22:30.578296" elapsed="0.000014"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:22:30.542855" elapsed="0.035531">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:22:40.597427" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:22:40.597030" elapsed="0.000431"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:22:40.617777" elapsed="0.000256"/>
</kw>
<msg time="2026-04-26T00:22:40.618090" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:40.617097" elapsed="0.001055"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:40.616615" elapsed="0.001615"/>
</kw>
<msg time="2026-04-26T00:22:40.618277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:40.607436" elapsed="0.010884"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:40.607016" elapsed="0.011377"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:22:40.619022" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:22:40.619067" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:22:40.618767" elapsed="0.000323"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:40.621742" 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:22:40.621305" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:40.622238" 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:22:40.621949" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:40.622313" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:22:40.622468" 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:22:40.620907" elapsed="0.001586"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:22:40.622647" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:40.623309" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:22:40.622977" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:40.623732" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:40.623495" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:40.624159" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:40.623907" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:40.624587" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:40.624843" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:40.624694" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:40.625083" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:40.624938" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:40.625303" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:40.625161" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:40.624675" elapsed="0.000703"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:40.624415" elapsed="0.000986"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:40.624232" elapsed="0.001194"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:22:40.625465" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:40.625675" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:22:40.625721" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:22:40.620213" elapsed="0.005531"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:22:40.626304" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:22:40.626388" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:22:40.626030" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:22:40.626988" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:22:40.626700" elapsed="0.000361">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:22:40.626482" elapsed="0.000646">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:22:40.626464" elapsed="0.000696">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:40.627314" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:40.627487" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:40.627552" elapsed="0.000015"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:22:40.619380" elapsed="0.008273">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:40.627824" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:40.627999" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:40.628164" elapsed="0.000020"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:22:40.618626" elapsed="0.009607">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:22:40.618456" elapsed="0.009832">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:22:40.628338" elapsed="0.000015"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:22:40.592512" elapsed="0.035916">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:22:50.646780" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:22:50.646381" elapsed="0.000434"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:22:50.666496" elapsed="0.000257"/>
</kw>
<msg time="2026-04-26T00:22:50.666815" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:50.665838" elapsed="0.001037"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:50.665384" elapsed="0.001584"/>
</kw>
<msg time="2026-04-26T00:22:50.667014" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:22:50.656517" elapsed="0.010540"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:22:50.656128" elapsed="0.011001"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:22:50.667726" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:22:50.667771" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:22:50.667493" elapsed="0.000301"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:50.670430" 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:22:50.670044" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:50.670948" 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:22:50.670617" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:22:50.671095" elapsed="0.000032"/>
</return>
<msg time="2026-04-26T00:22:50.671254" 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:22:50.669663" elapsed="0.001616"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:22:50.671431" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:22:50.672093" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:22:50.671744" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:50.672522" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:50.672280" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:22:50.672946" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:22:50.672698" elapsed="0.000275"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:50.673364" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:50.673618" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:50.673471" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:50.673838" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:50.673698" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:50.674077" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:22:50.673930" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:22:50.673452" elapsed="0.000699"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:22:50.673198" elapsed="0.000977"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:50.673019" elapsed="0.001180"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:22:50.674237" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:22:50.674429" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:22:50.674476" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:22:50.668962" elapsed="0.005536"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:22:50.675140" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:22:50.675217" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:22:50.674666" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:22:50.675799" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:22:50.675526" elapsed="0.000344">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:22:50.675308" elapsed="0.000644">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:22:50.675290" elapsed="0.000695">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:50.676140" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:50.676314" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:22:50.676379" elapsed="0.000015"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:22:50.668128" elapsed="0.008353">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:50.676652" elapsed="0.000022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:50.676817" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:22:50.676997" elapsed="0.000021"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:22:50.667353" elapsed="0.009717">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:22:50.667188" elapsed="0.009973">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:22:50.677213" elapsed="0.000015"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:22:50.642165" elapsed="0.035141">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:23:00.695934" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:23:00.695473" elapsed="0.000504"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:23:00.715910" elapsed="0.000282"/>
</kw>
<msg time="2026-04-26T00:23:00.716267" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:23:00.715202" elapsed="0.001133"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:23:00.714707" elapsed="0.001714"/>
</kw>
<msg time="2026-04-26T00:23:00.716468" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:23:00.705740" elapsed="0.010771"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:23:00.705343" elapsed="0.011240"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:23:00.717228" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:23:00.717273" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:23:00.716984" elapsed="0.000311"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:00.719996" 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:23:00.719528" elapsed="0.000498"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:00.720481" 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:23:00.720193" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:23:00.720555" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:23:00.720713" 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:23:00.719161" elapsed="0.001576"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:23:00.720894" elapsed="0.000171"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:00.721759" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:23:00.721224" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:00.722200" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:23:00.721960" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:00.722607" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:23:00.722373" elapsed="0.000260"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:00.723042" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:00.723312" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:00.723160" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:00.723532" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:00.723391" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:00.723748" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:00.723606" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:23:00.723139" elapsed="0.000681"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:00.722856" elapsed="0.001122"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:00.722678" elapsed="0.001336"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:23:00.724056" elapsed="0.000028"/>
</return>
<msg time="2026-04-26T00:23:00.724253" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:23:00.724297" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:23:00.718441" elapsed="0.005879"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:23:00.724764" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:23:00.724843" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:23:00.724493" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:23:00.725714" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:23:00.725336" elapsed="0.000479">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:23:00.725017" elapsed="0.000891">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:23:00.724986" elapsed="0.000988">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:00.726189" elapsed="0.000029"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:00.726431" elapsed="0.000028"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:00.726522" elapsed="0.000020"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:23:00.717593" elapsed="0.009104">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:00.726983" elapsed="0.000032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:00.727217" elapsed="0.000027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:00.727443" elapsed="0.000027"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:23:00.716821" elapsed="0.010719">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:23:00.716648" elapsed="0.010968">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:23:00.727685" elapsed="0.000020"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:23:00.691093" elapsed="0.036717">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:23:10.744138" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:23:10.743757" elapsed="0.000418"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:23:10.764184" elapsed="0.000232"/>
</kw>
<msg time="2026-04-26T00:23:10.764476" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:23:10.763516" elapsed="0.001023"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:23:10.763063" elapsed="0.001554"/>
</kw>
<msg time="2026-04-26T00:23:10.764662" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:23:10.754001" elapsed="0.010704"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:23:10.753567" elapsed="0.011209"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:23:10.765410" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:23:10.765455" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:23:10.765173" elapsed="0.000305"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:10.768398" 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:23:10.768016" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:10.768872" 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:23:10.768587" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:23:10.768960" elapsed="0.000031"/>
</return>
<msg time="2026-04-26T00:23:10.769143" 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:23:10.767628" elapsed="0.001540"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:23:10.769323" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:10.769985" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:23:10.769638" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:10.770408" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:23:10.770170" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:10.770816" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:23:10.770582" elapsed="0.000260"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:10.771257" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:10.771511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:10.771365" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:10.771733" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:10.771591" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:10.771967" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:10.771810" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:23:10.771346" elapsed="0.000697"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:10.771088" elapsed="0.000978"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:10.770888" elapsed="0.001202"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:23:10.772128" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:23:10.772324" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:23:10.772369" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:23:10.766702" elapsed="0.005690"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:23:10.772828" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:23:10.772904" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:23:10.772563" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:23:10.773516" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:23:10.773246" elapsed="0.000340">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:23:10.773011" elapsed="0.000639">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:23:10.772994" elapsed="0.000687">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:10.773834" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:10.774022" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:10.774089" elapsed="0.000015"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:23:10.765849" elapsed="0.008341">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:10.774362" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:10.774562" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:10.774728" elapsed="0.000020"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:23:10.765018" elapsed="0.009781">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:23:10.764835" elapsed="0.010018">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:23:10.774904" elapsed="0.000029"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:23:10.738181" elapsed="0.036832">No leader found.</status>
</kw>
<kw name="Shards_Stability_Get_Details" owner="ShardStability">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.792567" level="INFO">&amp;{shards_details} = { }</msg>
<var>&amp;{shards_details}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:23:20.792195" elapsed="0.000406"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-26T00:23:20.812489" elapsed="0.000230"/>
</kw>
<msg time="2026-04-26T00:23:20.812774" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:23:20.811825" elapsed="0.001009"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is at least ${lower_bound},
run Collections.Remove_Values_From_List [['default:config', 'default:operational', 'topology:config', 'topology:operational', 'inventory:config', 'inventory:operational'], 'entity-ownership:operational'] {} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:23:20.811345" elapsed="0.001565"/>
</kw>
<msg time="2026-04-26T00:23:20.812974" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:23:20.802472" elapsed="0.010546"/>
</kw>
<arg>Collections.Remove_Values_From_List</arg>
<arg>${shard_list}</arg>
<arg>entity-ownership:operational</arg>
<doc>Compare phosphorus to titanium and in case titanium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-26T00:23:20.802080" elapsed="0.011010"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Split String" owner="String">
<msg time="2026-04-26T00:23:20.813695" level="INFO">${shard_name} = default</msg>
<msg time="2026-04-26T00:23:20.813739" level="INFO">${shard_type} = config</msg>
<var>${shard_name}</var>
<var>${shard_type}</var>
<arg>${shard_details}</arg>
<arg>separator=:</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-04-26T00:23:20.813460" elapsed="0.000302"/>
</kw>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.816482" 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:23:20.816068" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.816978" 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:23:20.816678" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:23:20.817052" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:23:20.817207" 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:23:20.815644" elapsed="0.001588"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-26T00:23:20.817385" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.818043" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-26T00:23:20.817697" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.818462" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:23:20.818228" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.818865" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:23:20.818635" elapsed="0.000255"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.819299" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.819554" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:20.819407" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.819870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:20.819633" elapsed="0.000309"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.820112" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:20.819967" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:23:20.819388" elapsed="0.000798"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:20.819132" elapsed="0.001078"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.818953" elapsed="0.001281"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-26T00:23:20.820273" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:23:20.820473" level="INFO">${leader_list} = []</msg>
<msg time="2026-04-26T00:23:20.820518" level="INFO">${follower_list} = []</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-26T00:23:20.814940" elapsed="0.005601"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.820997" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:23:20.821074" level="INFO">${leader_count} = 0</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:23:20.820712" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.821657" level="FAIL">No leader found.</msg>
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.821384" elapsed="0.000343">No leader found.</status>
</kw>
<status status="FAIL" start="2026-04-26T00:23:20.821167" elapsed="0.002103">No leader found.</status>
</branch>
<status status="FAIL" start="2026-04-26T00:23:20.821149" elapsed="0.002159">No leader found.</status>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.823468" elapsed="0.000028"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.823650" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.823716" elapsed="0.000015"/>
</return>
<var>${leader}</var>
<var>${followers}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.814064" elapsed="0.009772">No leader found.</status>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${followers}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.824041" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_leader=${leader}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.824206" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${shards_details}</arg>
<arg>${shard_name}_${shard_type}_followers=${followers}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.824370" elapsed="0.000021"/>
</kw>
<var name="${shard_details}">default:config</var>
<status status="FAIL" start="2026-04-26T00:23:20.813315" elapsed="0.011127">No leader found.</status>
</iter>
<var>${shard_details}</var>
<value>@{shard_list}</value>
<status status="FAIL" start="2026-04-26T00:23:20.813150" elapsed="0.011346">No leader found.</status>
</for>
<return>
<value>${shards_details}</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.824547" elapsed="0.000015"/>
</return>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Return shard details stored in dictionary.
${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..</doc>
<status status="FAIL" start="2026-04-26T00:23:20.787724" elapsed="0.036915">No leader found.</status>
</kw>
<msg time="2026-04-26T00:23:20.824727" level="FAIL">Keyword 'ShardStability.Shards_Stability_Get_Details' failed after retrying for 1 minute. The last error was: No leader found.</msg>
<arg>60s</arg>
<arg>10s</arg>
<arg>ShardStability.Shards_Stability_Get_Details</arg>
<arg>${DEFAULT_SHARD_LIST}</arg>
<arg>verify_restconf=True</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.486687" elapsed="60.338134">Keyword 'ShardStability.Shards_Stability_Get_Details' failed after retrying for 1 minute. The last error was: No leader found.</status>
</kw>
<doc>Start each member and wait for sync.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:22:20.432716" elapsed="60.392305">Keyword 'ShardStability.Shards_Stability_Get_Details' failed after retrying for 1 minute. The last error was: No leader found.</status>
</test>
<kw name="Close All Connections" owner="SSHLibrary" type="TEARDOWN">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-26T00:23:20.825464" elapsed="0.000104"/>
</kw>
<doc>Unset tell-based protocol usage

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

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

Suite stops all odl nodes, outcomment usage of tell-based protocol in
config file (means make it false by default) and starts all nodes again.</doc>
<status status="FAIL" start="2026-04-26T00:22:20.233437" elapsed="60.592164"/>
</suite>
<suite id="s1-s6" name="Outages" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/outages.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.908305" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:23:20.904110" elapsed="0.004329"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-26T00:23:20.903860" elapsed="0.004722"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.913275" 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:23:20.909675" elapsed="0.003628"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-26T00:23:20.913543" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:20.913407" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:20.913378" elapsed="0.000235"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.914134" 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:23:20.913765" elapsed="0.000413"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.914656" 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:23:20.914339" elapsed="0.000343"/>
</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:23:20.915200" elapsed="0.000282"/>
</kw>
<msg time="2026-04-26T00:23:20.915578" level="INFO">${status} = PASS</msg>
<msg time="2026-04-26T00:23:20.915625" 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:23:20.914845" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.916200" 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:23:20.915814" elapsed="0.000412"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.917232" 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:23:20.916965" elapsed="0.000293"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.917664" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:23:20.917410" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.918153" 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:23:20.917845" elapsed="0.000335"/>
</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:23:20.920833" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:20.920648" elapsed="0.000258"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.918235" elapsed="0.002716"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.921518" 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:23:20.921111" elapsed="0.000451"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.922139" 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:23:20.921723" elapsed="0.000459"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.922727" 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:23:20.922341" elapsed="0.000428"/>
</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:23:20.916503" elapsed="0.006324"/>
</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:23:20.909340" elapsed="0.013543"/>
</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:23:20.923080" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:20.922967" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:20.922947" elapsed="0.000200"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.926204" 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:23:20.925801" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.926669" 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:23:20.926387" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:23:20.926739" elapsed="0.000036"/>
</return>
<msg time="2026-04-26T00:23:20.926898" 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:23:20.925480" elapsed="0.001459"/>
</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:23:20.927315" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:20.927142" elapsed="0.000236"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.927030" elapsed="0.000375"/>
</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:23:20.923363" elapsed="0.004095"/>
</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:23:20.927608" elapsed="0.000207"/>
</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:23:20.928132" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:20.927998" elapsed="0.000198"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.927864" elapsed="0.000357"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-26T00:23:20.908884" elapsed="0.019389"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.930840" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:20.930731" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:20.930713" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.935511" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:20.935406" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:20.935388" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.936505" 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:23:20.936133" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.937013" 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:23:20.936712" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:23:20.937083" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:23:20.937233" 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:23:20.935796" elapsed="0.001462"/>
</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:23:20.937590" 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:23:20.937824" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:20.937683" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:23:20.937667" elapsed="0.000231"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:20.937452" elapsed="0.000487"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.937308" elapsed="0.000656"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:23:20.935125" elapsed="0.002892"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-26T00:23:20.928844" elapsed="0.009226"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:23:20.928420" elapsed="0.009691"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-26T00:23:20.903541" elapsed="0.034617"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.939054" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-26T00:23:20.938706" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-04-26T00:23:20.939248" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-26T00:23:20.939153" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:20.939136" elapsed="0.000190"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.939480" elapsed="0.000021"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.939651" elapsed="0.000020"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.939822" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.940095" elapsed="0.000022"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.940345" elapsed="0.000024"/>
</kw>
<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:23:20.938414" elapsed="0.002018"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.941615" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:23:20.941084" elapsed="0.000559"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.945476" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:23:20.941803" elapsed="0.003719"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.948871" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:20.945599" elapsed="0.003348"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:20.945578" elapsed="0.003396"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-26T00:23:20.953977" level="INFO">${odl_connection} = 3</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-26T00:23:20.953521" elapsed="0.000484"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.955627" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:23:20.955703" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:23:20.955344" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:23:20.955883" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-26T00:23:20.957078" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-26T00:23:20.957405" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.956744" elapsed="0.001144">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:23:20.957962" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.956381" elapsed="0.001633"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.954900" elapsed="0.003224">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:23:20.958171" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.954512" elapsed="0.003704"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.954186" elapsed="0.004122">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-26T00:23:20.958359" elapsed="0.000018"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.953227" elapsed="0.005230">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.958619" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.958782" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-26T00:23:20.958903" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:20.958863" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:23:20.958846" elapsed="0.000134"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.963018" elapsed="0.000027"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.949222" elapsed="0.013910">OSError: [Errno 16] Device or resource busy</status>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.940761" elapsed="0.022456">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node1</arg>
<arg>http://${ODL_SYSTEM_1_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.963379" elapsed="0.000022"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node2</arg>
<arg>http://${ODL_SYSTEM_2_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.963599" elapsed="0.000022"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node3</arg>
<arg>http://${ODL_SYSTEM_3_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.963769" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${directory_with_template_folders}</arg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.963964" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${empty_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.964141" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.964315" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${modified_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.964488" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${url}</var>
<arg>/network-topology:network-topology/topology=topology-netconf</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.964663" elapsed="0.000037"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${config_topology_url}</arg>
<arg>${REST_API}${url}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.964853" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${operational_topology_url}</arg>
<arg>${REST_API}${url}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:20.965038" elapsed="0.000020"/>
</kw>
<doc>Setup everything needed for the test cases.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.903219" elapsed="0.061926">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s6-t1" name="Start_Testtool" line="52">
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.965213" elapsed="0.000420">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" line="58">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.965810" elapsed="0.000401">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t3" name="Configure_Device_On_Netconf" line="64">
<doc>Use node 1 to configure a testtool device on Netconf connector</doc>
<status status="FAIL" start="2026-04-26T00:23:20.966378" elapsed="0.000352">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t4" name="Wait_For_Device_To_Become_Visible_For_All_Nodes" line="72">
<doc>Check that the cluster communication about a new Netconf device configuration works</doc>
<status status="FAIL" start="2026-04-26T00:23:20.966892" elapsed="0.000439">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t5" name="Check_Device_Data_Is_Seen_As_Empty_On_All_Nodes" line="78">
<doc>Sanity check against possible data left-overs from previous suites. Also causes the suite to wait until the entire cluster sees the device and its data mount.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.967491" elapsed="0.000552">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t6" name="Kill_node1_Before_Create" line="87">
<doc>Simulate node 1 crashes just before device data is created, fail if node 1 survives.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.968207" elapsed="0.000378">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t7" name="Create_Device_Data_With_node1_Down" line="91">
<doc>Check that the create requests work when node 1 is down.
As ODL may be in the process of connecting possible new master to the device,
the action is retried few times.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:20.968785" elapsed="0.000565">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t8" name="Check_New_Device_Data_Is_Visible_On_Nodes_Without_node1" line="107">
<doc>Check that the new device data is propagated in the cluster even when node 1 is down.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:20.969516" elapsed="0.000468">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t9" name="Restart_node1_After_Create_And_Dump_Its_Topology_Data" line="123">
<doc>Simulate node 1 restarted by admin just after device data is created and the change propagated in the cluster, fail if node 1 fails to boot.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.970149" elapsed="0.000514">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t10" name="Check_New_Device_Data_Is_Visible_On_node1" line="128">
<doc>Check that the created device data is propagated to node 1 as well.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:20.970825" elapsed="0.000415">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t11" name="Kill_node2_Before_Modify" line="139">
<doc>Simulate node 2 crashes just before device data is modified, fail if node 2 survives.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.971405" elapsed="0.000382">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t12" name="Modify_Device_Data_With_node2_Down" line="143">
<doc>Check that the modification requests work when node 2 is down.
As ODL may be in the process of connecting possible new master to the device,
the action is retried few times.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:20.971963" elapsed="0.000543">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t13" name="Check_Modified_Device_Data_Is_Visible_On_Nodes_Without_node2" line="160">
<doc>Check that the device data modification is propagated in the cluster even when node 2 is down.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:20.972666" elapsed="0.000515">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t14" name="Restart_node2_After_Modify_And_Dump_Its_Topology_Data" line="177">
<doc>Simulate node 2 restarted by admin just after device data is modified and the change propagated in the cluster, fail if node 2 fails to boot.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.973379" elapsed="0.000518">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t15" name="Check_Modified_Device_Data_Is_Visible_On_node2" line="182">
<doc>Check that the device data modification is propagated to node 2 as well.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:20.974079" elapsed="0.000421">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t16" name="Kill_node3_Before_Delete" line="193">
<doc>Simulate node 3 crashes just before device data is deleted, fail if node 3 survives.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.974665" elapsed="0.000392">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t17" name="Delete_Device_Data_With_node3_Down" line="197">
<doc>Check that the data removal requests work when node 3 is down.
As ODL may be in the process of connecting possible new master to the device,
the action is retried few times.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:20.975258" elapsed="0.000551">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t18" name="Check_Device_Data_Removal_Is_Visible_On_Nodes_Without_node3" line="214">
<doc>Check that the device data removal is propagated in the cluster even when node 3 is down.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:20.975992" elapsed="0.000486">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t19" name="Restart_node3_After_Delete_And_Dump_Its_Topology_Data" line="221">
<doc>Simulate node 3 restarted by admin just after device data is deleted and the change propagated in the cluster, fail if node 3 fails to boot.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.976638" elapsed="0.000571">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t20" name="Check_Device_Data_Removal_Is_Visible_On_node3" line="226">
<doc>Check that the device data removal is propagated to node 3 as well.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:20.977388" elapsed="0.000435">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t21" name="Deconfigure_Device_In_Netconf" line="232">
<doc>Make request to deconfigure the device on Netconf connector to clean things up and also check that it still works after all the node outages.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.978002" elapsed="0.000478">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s6-t22" name="Check_Device_Deconfigured" line="237">
<doc>Check that the device deconfiguration is propagated throughout the cluster correctly.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.978639" elapsed="0.000404">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-26T00:23:20.979760" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-26T00:23:20.979683" elapsed="0.000129"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:23:20.980867" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:23:20.980504" elapsed="0.000391"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-26T00:23:20.981257" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.981062" elapsed="0.000902">Cannot open session, you need to establish a connection first.</status>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.980292" elapsed="0.001790">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-26T00:23:20.982399" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.982238" elapsed="0.000735">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-26T00:23:20.987002" level="FAIL">Variable '${testtool_log}' not found.</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.983139" elapsed="0.003897">Variable '${testtool_log}' not found.</status>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.980027" elapsed="0.007135">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.979455" elapsed="0.007810">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>netconf cluster node outage test suite (CRUD operations).

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

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


Perform one of the basic operations (Create, Read, Update and Delete or CRUD)
on device data mounted onto a netconf connector while one of the nodes is
down and see if they work. Then bring the dead node up and check that it sees
the operations that were made while it was down are visible on it as well.

The node is brought down before each of the "Create", "Update" and "Delete"
operations and brought and back up after these operations. Before the dead
node is brought up, a test case makes sure the operation is properly
propagated within the cluster.

Currently each of the 3 operations is done once. "Create" is done while
node 1 is down, "Update" while node 2 is down and "Delete" while node 3
is down.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.826177" elapsed="0.161165">Suite setup failed:
OSError: [Errno 16] Device or resource busy

Also suite teardown failed:
Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</suite>
<suite id="s1-s7" name="Entity" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/entity.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.084903" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:23:21.080735" elapsed="0.004301"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-26T00:23:21.080508" elapsed="0.004599"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.089913" 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:23:21.086216" elapsed="0.003745"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-26T00:23:21.090210" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.090066" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.090036" elapsed="0.000256"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.090837" 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:23:21.090464" elapsed="0.000417"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.091382" 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:23:21.091067" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-26T00:23:21.091905" elapsed="0.000306"/>
</kw>
<msg time="2026-04-26T00:23:21.092307" level="INFO">${status} = PASS</msg>
<msg time="2026-04-26T00:23:21.092352" 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:23:21.091570" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.092903" 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:23:21.092538" elapsed="0.000407"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.093919" 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:23:21.093658" elapsed="0.000308"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.094367" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:23:21.094112" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.094834" 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:23:21.094546" elapsed="0.000314"/>
</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:23:21.097267" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:21.097082" elapsed="0.000257"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.094914" elapsed="0.002452"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.097977" 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:23:21.097561" elapsed="0.000460"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.098571" 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:23:21.098180" elapsed="0.000432"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.099166" 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:23:21.098770" elapsed="0.000437"/>
</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:23:21.093196" elapsed="0.006068"/>
</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:23:21.085859" elapsed="0.013459"/>
</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:23:21.099495" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.099384" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.099365" elapsed="0.000194"/>
</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:23:21.102686" 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:23:21.102309" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.103169" 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:23:21.102867" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:23:21.103239" elapsed="0.000037"/>
</return>
<msg time="2026-04-26T00:23:21.103400" 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:23:21.101987" elapsed="0.001437"/>
</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:23:21.103796" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:21.103621" elapsed="0.000234"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.103511" elapsed="0.000370"/>
</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:23:21.099773" elapsed="0.004176"/>
</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:23:21.104101" elapsed="0.000208"/>
</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:23:21.104607" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:21.104474" elapsed="0.000196"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.104359" elapsed="0.000336"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-26T00:23:21.085429" elapsed="0.019318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.107270" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.107163" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.107145" 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:23:21.112039" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.111917" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.111899" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.113032" 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:23:21.112642" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.113500" 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:23:21.113217" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:23:21.113603" elapsed="0.000029"/>
</return>
<msg time="2026-04-26T00:23:21.113757" 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:23:21.112324" elapsed="0.001457"/>
</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:23:21.114137" 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:23:21.114381" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:21.114234" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:23:21.114217" elapsed="0.000239"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:21.113997" elapsed="0.000482"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.113832" elapsed="0.000670"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:23:21.111634" elapsed="0.002918"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-26T00:23:21.105320" elapsed="0.009285"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:23:21.104896" elapsed="0.009750"/>
</kw>
<arg>http_timeout=2</arg>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-26T00:23:21.080189" elapsed="0.034504"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.115579" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-26T00:23:21.115257" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-04-26T00:23:21.115771" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-26T00:23:21.115676" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.115659" elapsed="0.000190"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.116024" elapsed="0.000022"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.116198" elapsed="0.000051"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.116409" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.116585" elapsed="0.000021"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.116830" elapsed="0.000024"/>
</kw>
<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:23:21.114966" elapsed="0.001950"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.117714" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:23:21.117441" elapsed="0.000305"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.121709" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:23:21.117901" elapsed="0.003856"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.125091" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:21.121828" elapsed="0.003325"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.121810" elapsed="0.003368"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.130279" level="INFO">${odl_connection} = 4</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-26T00:23:21.129850" elapsed="0.000455"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.131907" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:23:21.132003" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:23:21.131627" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:23:21.132183" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.133389" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-26T00:23:21.133711" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.133070" elapsed="0.001118">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:23:21.134245" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.132669" elapsed="0.001625"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.131202" elapsed="0.003200">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:23:21.134449" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.130803" elapsed="0.003690"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.130482" elapsed="0.004101">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.134632" elapsed="0.000016"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.129532" elapsed="0.005195">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.134890" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.135072" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-26T00:23:21.135189" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.135151" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:23:21.135135" elapsed="0.000112"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.140298" elapsed="0.000027"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.125511" elapsed="0.014903">OSError: [Errno 16] Device or resource busy</status>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.117167" elapsed="0.023331">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${node1_session}</var>
<arg>member_index=1</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.140750" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${node2_session}</var>
<arg>member_index=2</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.140990" elapsed="0.000023"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${node3_session}</var>
<arg>member_index=3</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.141209" elapsed="0.000023"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${node1_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.141385" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${node2_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.141552" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${node3_session}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.141719" elapsed="0.000034"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${directory_with_template_folders}</arg>
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/../../../variables/netconf/CRUD</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.141901" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${empty_data}</arg>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;/data&gt;</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.142087" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${cont}</var>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.142252" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${contend}</var>
<arg>&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.142416" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_data}</arg>
<arg>${cont}Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.142585" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${modified_data}</arg>
<arg>${cont}Modified Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.142754" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${modified_data_2}</arg>
<arg>${cont}Another Modified Content${contend}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.142937" elapsed="0.000021"/>
</kw>
<doc>Setup everything needed for the test cases.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.079837" elapsed="0.063210">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s7-t1" name="Start_Testtool" line="63">
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.143110" elapsed="0.000403">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" line="69">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.143689" elapsed="0.000400">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t3" name="Configure_Device_On_Netconf" line="75">
<doc>Use node 1 to configure a testtool device on Netconf connector.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.144254" elapsed="0.000352">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t4" name="Wait_For_Device_To_Become_Visible_For_All_Nodes" line="83">
<doc>Wait for the whole cluster to see the device.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.144771" elapsed="0.000378">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t5" name="Check_Config_Data_Before_Data_Creation" line="89">
<doc>Check if there really is no data present on none of the nodes</doc>
<status status="FAIL" start="2026-04-26T00:23:21.145311" elapsed="0.000366">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t6" name="Create_Device_Data" line="110">
<doc>Create some data on the device and propagate it throughout the cluster.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.145865" elapsed="0.000358">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t7" name="Check_Config_Data_After_Data_Creation" line="120">
<doc>Check if the data we just added into the cluster is really there</doc>
<status status="FAIL" start="2026-04-26T00:23:21.146385" elapsed="0.000369">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t8" name="Find_And_Shutdown_Device_Entity_Owner" line="141">
<doc>Simulate a failure of the owner of the entity that represents the device.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.146913" elapsed="0.000394">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t9" name="Wait_For_New_Owner_To_Appear" line="161">
<doc>Wait for the cluster to recover from the failure and choose a new owner for the entity.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:21.147471" elapsed="0.000402">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t10" name="Check_Config_Data_Before_Modification_With_Original_Owner_Down" line="166">
<doc>Check if data is present and retrievable from follower nodes</doc>
<status status="FAIL" start="2026-04-26T00:23:21.148053" elapsed="0.000410">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t11" name="Modify_Device_Data_When_Original_Owner_Is_Down" line="182">
<doc>Attempt to modify the data on the device after recovery and see if it still works.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.148623" elapsed="0.000431">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t12" name="Check_Config_Data_After_Modification_With_Original_Owner_Down" line="193">
<doc>Check if data is written correctly when original owner is shut down</doc>
<status status="FAIL" start="2026-04-26T00:23:21.149210" elapsed="0.000420">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t13" name="Restart_Original_Entity_Owner" line="209">
<doc>Restart the original entity owner and see if it can still see the device and the new data on it.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.149805" elapsed="0.000457">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t14" name="Check_Config_Data_After_Original_Owner_Restart" line="213">
<doc>Sanity check if we still can retrieve our data from the original device owner.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.150426" elapsed="0.000406">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t15" name="Modify_Device_Data_With_Original_Owner" line="223">
<doc>Check that the original owner of the entity is still able to modify the data on the device</doc>
<status status="FAIL" start="2026-04-26T00:23:21.151009" elapsed="0.000409">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t16" name="Check_Config_Data_After_Modification_With_Original_Owner_Up" line="234">
<doc>Check if data has really been written as we expect. Fails if Modify_Device_Data_With_Original_Owner fails.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.151578" elapsed="0.000493">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s7-t17" name="Deconfigure_Device_In_Netconf" line="255">
<doc>Make request to deconfigure the device on Netconf connector and see if it works.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:21.152234" elapsed="0.000392">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-26T00:23:21.153430" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-26T00:23:21.153341" elapsed="0.000148"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.154589" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:23:21.154202" elapsed="0.000415"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.154988" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.154768" elapsed="0.000704">Cannot open session, you need to establish a connection first.</status>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.153988" elapsed="0.001607">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.156163" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.155752" elapsed="0.000969">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.160786" level="FAIL">Variable '${testtool_log}' not found.</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.156887" elapsed="0.003934">Variable '${testtool_log}' not found.</status>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.153686" elapsed="0.007272">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.153076" elapsed="0.007991">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>Test suite for netconf device entity ownership handling during outages.

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

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


Perform basic operations (Create, Read, Update and Delete or CRUD) on device
data mounted onto a netconf connector and see if they work.

The suite recognizes 3 nodes, "CONFIGURER" (the node that configures the
device at the beginning and then deconfigures it at the end), "SETTER" (the
node that manipulates the data on the device) and "CHECKER" (the node that
checks the data on the device). The configured device and the results of each
data operation on it is expected to be visible on all nodes so after each
operation three test cases make sure they can see the result on their
respective nodes.

The 3 nodes are configured by placing "node1", "node2" or "node3" into the
${NODE_CONFIGURER}, ${NODE_SETTER} and ${NODE_CHECKER} to make the node
a "CONFIGURER", "SETTER" and "CHECKER" respectively. The "nodeX" name refers
to the node with its IP address configured with the ${ODL_SYSTEM_X_IP}
variable where the "X" is 1, 2 or 3.

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-04-26T00:23:20.988015" elapsed="0.173122">Suite setup failed:
OSError: [Errno 16] Device or resource busy

Also suite teardown failed:
Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</suite>
<suite id="s1-s8" name="CRUD" source="/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/suites/netconf/clustering/CRUD.robot">
<kw name="Setup_Everything" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.248227" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:23:21.244028" elapsed="0.004251"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-26T00:23:21.243782" elapsed="0.004566"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.253113" 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:23:21.249440" elapsed="0.003701"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-26T00:23:21.253350" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.253231" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.253206" elapsed="0.000267"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.254003" 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:23:21.253629" elapsed="0.000418"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.254546" 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:23:21.254210" elapsed="0.000363"/>
</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:23:21.255096" elapsed="0.000289"/>
</kw>
<msg time="2026-04-26T00:23:21.255487" level="INFO">${status} = PASS</msg>
<msg time="2026-04-26T00:23:21.255536" 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:23:21.254738" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.256111" 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:23:21.255725" elapsed="0.000413"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.257109" 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:23:21.256824" elapsed="0.000312"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.257538" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-26T00:23:21.257282" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.258022" 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:23:21.257718" elapsed="0.000330"/>
</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:23:21.260724" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:21.260537" elapsed="0.000259"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.258103" elapsed="0.002721"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.261398" 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:23:21.260999" elapsed="0.000442"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.262013" 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:23:21.261599" elapsed="0.000456"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.262624" 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:23:21.262220" elapsed="0.000447"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-26T00:23:21.256382" elapsed="0.006342"/>
</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:23:21.249099" elapsed="0.013681"/>
</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:23:21.262973" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.262844" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.262826" elapsed="0.000213"/>
</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:23:21.266066" 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:23:21.265673" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.266701" 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:23:21.266249" elapsed="0.000483"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:23:21.266782" elapsed="0.000037"/>
</return>
<msg time="2026-04-26T00:23:21.267003" 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:23:21.265350" elapsed="0.001679"/>
</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:23:21.267362" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:21.267189" elapsed="0.000232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.267081" elapsed="0.000365"/>
</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:23:21.263255" elapsed="0.004243"/>
</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:23:21.267722" elapsed="0.000229"/>
</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:23:21.268252" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:21.268119" elapsed="0.000197"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.268001" elapsed="0.000341"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-26T00:23:21.248643" elapsed="0.019756"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.271002" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.270877" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.270859" elapsed="0.000208"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.275752" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.275642" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.275623" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.276745" 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:23:21.276373" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.277230" 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:23:21.276944" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-26T00:23:21.277298" elapsed="0.000027"/>
</return>
<msg time="2026-04-26T00:23:21.277452" 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:23:21.276053" elapsed="0.001423"/>
</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:23:21.277808" 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:23:21.278064" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:21.277902" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:23:21.277885" elapsed="0.000255"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-26T00:23:21.277669" elapsed="0.000494"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.277525" elapsed="0.000661"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-26T00:23:21.275324" elapsed="0.002914"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-26T00:23:21.268978" elapsed="0.009313"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-26T00:23:21.268548" elapsed="0.009784"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-26T00:23:21.243474" elapsed="0.034905"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.279189" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-26T00:23:21.278910" elapsed="0.000305"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.283276" level="INFO">${NetconfKeywords__mounted_device_types} = {}</msg>
<arg>${NetconfKeywords__mounted_device_types}</arg>
<arg>${tmp}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-26T00:23:21.279370" elapsed="0.003952"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<arg>timeout=2</arg>
<doc>Create "default" session to ${url} with authentication and connection parameters.
This Keyword is in this Resource only so that user do not need to call RequestsLibrary directly.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.286723" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-26T00:23:21.283393" elapsed="0.003392"/>
</branch>
<status status="PASS" start="2026-04-26T00:23:21.283375" elapsed="0.003435"/>
</if>
<kw name="Initialize_Artifact_Deployment_And_Usage" owner="NexusKeywords">
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.291863" level="INFO">${odl_connection} = 5</msg>
<var>${odl_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-26T00:23:21.291448" elapsed="0.000441"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.293533" level="INFO">Length is 0.</msg>
<msg time="2026-04-26T00:23:21.293647" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-26T00:23:21.293249" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-26T00:23:21.293830" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.295050" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-26T00:23:21.295375" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.294708" elapsed="0.001136">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:23:21.295901" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.294337" elapsed="0.001631"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.292804" elapsed="0.003272">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-26T00:23:21.296124" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.292418" elapsed="0.003751"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.292090" elapsed="0.004169">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-26T00:23:21.296308" elapsed="0.000017"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.291155" elapsed="0.005249">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.296567" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.296731" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-26T00:23:21.296849" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-26T00:23:21.296811" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-26T00:23:21.296794" elapsed="0.000113"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.301066" elapsed="0.000028"/>
</kw>
<doc>Places search utility to ODL system, which will be needed for version detection.
By default also initialize a SSH connection to Tools system,
as following Keywords assume a working connection towards target system.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.287067" elapsed="0.014114">OSError: [Errno 16] Device or resource busy</status>
</kw>
<arg>create_session_for_templated_requests=False</arg>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.278633" elapsed="0.022633">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node1</arg>
<arg>http://${ODL_SYSTEM_1_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.301431" elapsed="0.000021"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node2</arg>
<arg>http://${ODL_SYSTEM_2_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.301604" elapsed="0.000021"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>node3</arg>
<arg>http://${ODL_SYSTEM_3_IP}:${RESTCONFPORT}</arg>
<arg>headers=${HEADERS_XML}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-26T00:23:21.301775" elapsed="0.000020"/>
</kw>
<doc>Initialize SetupUtils, setup everything needed for the test cases.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.243168" elapsed="0.058716">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s8-t1" name="Start_Testtool" line="68">
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.301964" elapsed="0.000407">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t2" name="Check_Device_Is_Not_Mounted_At_Beginning" line="74">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:21.302550" elapsed="0.000435">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t3" name="Configure_Device_On_Netconf" line="79">
<doc>Make request to configure a testtool device on Netconf connector</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:21.303160" elapsed="0.000376">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t4" name="Check_Configurer_Has_Netconf_Connector_For_Device" line="88">
<doc>Get the list of mounts and search for our device there. Fail if not found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:21.303710" elapsed="0.000456">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t5" name="Wait_For_Device_To_Become_Visible_For_Configurer" line="98">
<doc>Wait until the device becomes visible on configurer node.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.304333" elapsed="0.000381">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t6" name="Wait_For_Device_To_Become_Visible_For_Checker" line="102">
<doc>Wait until the device becomes visible on checker node.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.304875" elapsed="0.000388">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t7" name="Wait_For_Device_To_Become_Visible_For_Setter" line="106">
<doc>Wait until the device becomes visible on setter node.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.305424" elapsed="0.000364">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t8" name="Check_Device_Data_Is_Seen_As_Empty_On_Configurer" line="110">
<doc>Get the device data as seen by configurer and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.305966" elapsed="0.000455">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t9" name="Check_Device_Data_Is_Seen_As_Empty_On_Checker" line="119">
<doc>Get the device data as seen by checker and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.306585" elapsed="0.000440">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t10" name="Check_Device_Data_Is_Seen_As_Empty_On_Setter" line="128">
<doc>Get the device data as seen by setter and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.307189" elapsed="0.000385">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t11" name="Create_Device_Data" line="137">
<doc>Send some sample test data into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.307739" elapsed="0.000376">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t12" name="Check_New_Device_Data_Is_Visible_On_Setter" line="147">
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.308279" elapsed="0.000383">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t13" name="Check_New_Device_Data_Is_Visible_On_Checker" line="156">
<doc>Check that the created device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.308823" elapsed="0.000412">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t14" name="Check_New_Device_Data_Is_Visible_On_Configurer" line="165">
<doc>Check that the created device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.309398" elapsed="0.000408">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t15" name="Modify_Device_Data" line="174">
<doc>Send a request to change the sample test data and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.309981" elapsed="0.000357">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t16" name="Check_Device_Data_Is_Modified" line="185">
<doc>Get the device data and make sure it contains the modified content.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.310495" elapsed="0.000374">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t17" name="Check_Modified_Device_Data_Is_Visible_On_Checker" line="190">
<doc>Check that the modified device data make their way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.311041" elapsed="0.000411">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t18" name="Check_Modified_Device_Data_Is_Visible_On_Configurer" line="195">
<doc>Check that the modified device data make their way into the configurer node.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.311612" elapsed="0.000433">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t19" name="Delete_Device_Data" line="200">
<doc>Send a request to delete the sample test data on the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.312204" elapsed="0.000402">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t20" name="Check_Device_Data_Is_Deleted" line="211">
<doc>Get the device data and make sure it is empty again.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.312765" elapsed="0.000358">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t21" name="Check_Device_Data_Deletion_Is_Visible_On_Checker" line="216">
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.313289" elapsed="0.000412">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t22" name="Check_Device_Data_Deletion_Is_Visible_On_Configurer" line="221">
<doc>Check that the device data deletion makes its way into the checker node.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.313862" elapsed="0.000435">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t23" name="Deconfigure_Device_In_Netconf" line="226">
<doc>Make request to deconfigure the device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:21.314461" elapsed="0.000411">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t24" name="Check_Device_Deconfigured_On_Configurer" line="232">
<doc>Check that the device is really going to be gone. Fail if still there after one minute.
This is an expected behavior as the unmount request is sent to the config subsystem which
then triggers asynchronous disconnection of the device which is reflected in the operational
data once completed. This test makes sure this asynchronous operation does not take
unreasonable amount of time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:21.315072" elapsed="0.000933">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t25" name="Check_Device_Deconfigured_On_Checker" line="241">
<doc>Check that the device is going to be gone from the checker node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:21.316177" elapsed="0.000459">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s8-t26" name="Check_Device_Deconfigured_On_Setter" line="246">
<doc>Check that the device is going to be gone from the setter node. Fail if still there after one minute.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-26T00:23:21.316799" elapsed="0.000462">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-26T00:23:21.318148" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-26T00:23:21.318055" elapsed="0.000156"/>
</kw>
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-26T00:23:21.319655" level="INFO">${ctrl_c} = </msg>
<var>${ctrl_c}</var>
<arg>chr(int(3))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-26T00:23:21.318943" elapsed="0.000741"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.320078" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.319840" elapsed="0.000725">Cannot open session, you need to establish a connection first.</status>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.318692" elapsed="0.001996">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.321029" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.320847" elapsed="0.000744">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-26T00:23:21.325876" level="FAIL">Variable '${testtool_log}' not found.</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.321807" elapsed="0.004103">Variable '${testtool_log}' not found.</status>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.318412" elapsed="0.007629">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.317735" elapsed="0.008415">Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</kw>
<doc>netconf clustered CRUD test suite.

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

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


Perform basic operations (Create, Read, Update and Delete or CRUD) on device
data mounted onto a netconf connector and see if they work.

The suite recognizes 3 nodes, "CONFIGURER" (the node that configures the
device at the beginning and then deconfigures it at the end), "SETTER" (the
node that manipulates the data on the device) and "CHECKER" (the node that
checks the data on the device). The configured device and the results of each
data operation on it is expected to be visible on all nodes so after each
operation three test cases make sure they can see the result on their
respective nodes.

The 3 nodes are configured by placing "node1", "node2" or "node3" into the
node1, node2 and node3 to make the node
a "CONFIGURER", "SETTER" and "CHECKER" respectively. The "nodeX" name refers
to the node with its IP address configured with the ${ODL_SYSTEM_X_IP}
variable where the "X" is 1, 2 or 3.

The suite checks the integrity of the presence of the device and the data
seen on the device only for nodes that have at least one of the roles
("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
a "checker list" of sorts and have only one checking test case that runs
through the check list and performs the test on each node listed. However
this currently has fairly low priority due to Beryllium delivery date so
it was left out.</doc>
<status status="FAIL" start="2026-04-26T00:23:21.161790" elapsed="0.164448">Suite setup failed:
OSError: [Errno 16] Device or resource busy

Also suite teardown failed:
Several failures occurred:

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

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

3) Variable '${testtool_log}' not found.</status>
</suite>
<status status="FAIL" start="2026-04-26T00:21:18.486590" elapsed="122.840806"/>
</suite>
<statistics>
<total>
<stat pass="4" fail="136" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="4" fail="36" skip="0">critical</stat>
</tag>
<suite>
<stat name="netconf-clustering.txt" id="s1" pass="4" fail="136" skip="0">netconf-clustering.txt</stat>
<stat name="CRUD" id="s1-s1" pass="0" fail="26" skip="0">netconf-clustering.txt.CRUD</stat>
<stat name="Bug8086" id="s1-s2" pass="0" fail="26" skip="0">netconf-clustering.txt.Bug8086</stat>
<stat name="Restart Odl With Tell Based False" id="s1-s3" pass="2" fail="1" skip="0">netconf-clustering.txt.Restart Odl With Tell Based False</stat>
<stat name="Entity" id="s1-s4" pass="0" fail="17" skip="0">netconf-clustering.txt.Entity</stat>
<stat name="Restart Odl With Tell Based False" id="s1-s5" pass="2" fail="1" skip="0">netconf-clustering.txt.Restart Odl With Tell Based False</stat>
<stat name="Outages" id="s1-s6" pass="0" fail="22" skip="0">netconf-clustering.txt.Outages</stat>
<stat name="Entity" id="s1-s7" pass="0" fail="17" skip="0">netconf-clustering.txt.Entity</stat>
<stat name="CRUD" id="s1-s8" pass="0" fail="26" skip="0">netconf-clustering.txt.CRUD</stat>
</suite>
</statistics>
<errors>
<msg time="2026-04-26T00:21:18.762854" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:21:18.785780" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:21:18.854323" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:21:18.890844" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:21:18.963318" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:21:18.996074" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:22:20.043611" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:22:20.044747" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:22:20.045229" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:22:20.078042" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:22:20.079626" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:22:20.081537" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:20.831816" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:20.832988" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:20.833596" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:20.842825" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:20.844470" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:20.846373" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.Outages' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:20.993505" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:20.994769" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:20.995236" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:21.004562" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:21.006026" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:21.007902" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.Entity' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:21.165586" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:21.167072" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:21.169620" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:21.170107" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:21.178016" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-26T00:23:21.178722" level="WARN">Error in file '/w/workspace/netconf-csit-3node-clustering-only-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-clustering.txt.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
</errors>
</robot>
